Compare commits

...

8 Commits

Author SHA1 Message Date
Eduardo Gulias Davis 30562b69fc Merge branch 'taz77-correct-readme-php-example-code-php-dependencies' 2016-08-07 23:18:59 +02:00
Eduardo Gulias Davis cbb8b9e152 PHPStorm help and composer suggestion 2016-08-07 23:16:06 +02:00
Eduardo Gulias Davis cf670406e5 Merge branch 'correct-readme-php-example-code-php-dependencies' of https://github.com/taz77/EmailValidator into taz77-correct-readme-php-example-code-php-dependencies 2016-08-07 23:11:36 +02:00
Issei.M 4d446bf971 NoRFCWarningsValidation now has an InvalidEmail instance if invalid email is passed (#126)
* NoRFCWarningsValidation now has an InvalidEmail instance if invalid email is passed

* fix mentioned point
2016-08-03 22:42:12 +02:00
Issei.M 4f0f9023f0 MultipleValidationWithAnd::getError() now returns NULL if no errors (#124)
* MultipleValidationWithAnd::getError() now returns NULL if no errors

* improve adding error logic

* reword something, add tips

* fix CS
remove wrong tips
2016-07-29 22:43:15 +02:00
Brady 9160e26b13 List and links
Turned requirements into an unordered list. Removed the PHPstorm logo as it doesn't exist and could not find one to replace it.
2016-07-19 06:49:04 +02:00
Brady eb036b7d1c Correct PHP example. Add a requirements section.
Corrected PHP example for missing semi-colons. Added a new requirements section that explains the need for composer and the need of the PHP Intl library to use the spoof validation.
2016-07-18 11:55:21 +02:00
Issei.M 19811e0082 MultipleValidatorWithAnd now can break out of loop when error occurs (#122)
* MultipleValidatorWithAnd now can break out of loop when error occurs

* improved logic

* updated doc

* bugfix
2016-07-12 15:22:10 +02:00
9 changed files with 206 additions and 36 deletions
+15 -2
View File
@@ -4,18 +4,31 @@ namespace Egulias\EmailValidator\Validation;
use Egulias\EmailValidator\EmailLexer; use Egulias\EmailValidator\EmailLexer;
use Egulias\EmailValidator\Exception\InvalidEmail; use Egulias\EmailValidator\Exception\InvalidEmail;
use Egulias\EmailValidator\Warning\Warning;
interface EmailValidation interface EmailValidation
{ {
/**
* Returns true if the given email is valid.
*
* @param string $email The email you want to validate.
* @param EmailLexer $emailLexer The email lexer.
*
* @return bool
*/
public function isValid($email, EmailLexer $emailLexer); public function isValid($email, EmailLexer $emailLexer);
/** /**
* @return InvalidEmail * Returns the validation error.
*
* @return InvalidEmail|null
*/ */
public function getError(); public function getError();
/** /**
* @return array of Warning * Returns the validation warnings.
*
* @return Warning[]
*/ */
public function getWarnings(); public function getWarnings();
} }
@@ -0,0 +1,11 @@
<?php
namespace Egulias\EmailValidator\Validation\Error;
use Egulias\EmailValidator\Exception\InvalidEmail;
class RFCWarnings extends InvalidEmail
{
const CODE = 997;
const REASON = 'Warnings were found.';
}
@@ -7,19 +7,55 @@ use Egulias\EmailValidator\Validation\Exception\EmptyValidationList;
class MultipleValidationWithAnd implements EmailValidation class MultipleValidationWithAnd implements EmailValidation
{ {
/**
* If one of validations gets failure skips all succeeding validation.
* This means MultipleErrors will only contain a single error which first found.
*/
const STOP_ON_ERROR = 0;
/**
* All of validations will be invoked even if one of them got failure.
* So MultipleErrors will contain all causes.
*/
const ALLOW_ALL_ERRORS = 1;
/**
* @var EmailValidation[]
*/
private $validations = []; private $validations = [];
/**
* @var array
*/
private $warnings = []; private $warnings = [];
/**
* @var MultipleErrors
*/
private $error; private $error;
public function __construct(array $validations) /**
* @var bool
*/
private $mode;
/**
* @param EmailValidation[] $validations The validations.
* @param int $mode The validation mode (one of the constants).
*/
public function __construct(array $validations, $mode = self::ALLOW_ALL_ERRORS)
{ {
if (count($validations) == 0) { if (count($validations) == 0) {
throw new EmptyValidationList(); throw new EmptyValidationList();
} }
$this->validations = $validations; $this->validations = $validations;
$this->mode = $mode;
} }
/**
* {@inheritdoc}
*/
public function isValid($email, EmailLexer $emailLexer) public function isValid($email, EmailLexer $emailLexer)
{ {
$result = true; $result = true;
@@ -28,18 +64,45 @@ class MultipleValidationWithAnd implements EmailValidation
$emailLexer->reset(); $emailLexer->reset();
$result = $result && $validation->isValid($email, $emailLexer); $result = $result && $validation->isValid($email, $emailLexer);
$this->warnings = array_merge($this->warnings, $validation->getWarnings()); $this->warnings = array_merge($this->warnings, $validation->getWarnings());
$errors[] = $validation->getError(); $errors = $this->addNewError($validation->getError(), $errors);
if ($this->shouldStop($result)) {
break;
}
} }
$this->error = new MultipleErrors($errors);
if (!empty($errors)) {
$this->error = new MultipleErrors($errors);
}
return $result; return $result;
} }
private function addNewError($possibleError, array $errors)
{
if (null !== $possibleError) {
$errors[] = $possibleError;
}
return $errors;
}
private function shouldStop($result)
{
return !$result && $this->mode === self::STOP_ON_ERROR;
}
/**
* {@inheritdoc}
*/
public function getError() public function getError()
{ {
return $this->error; return $this->error;
} }
/**
* {@inheritdoc}
*/
public function getWarnings() public function getWarnings()
{ {
return $this->warnings; return $this->warnings;
@@ -3,11 +3,39 @@
namespace Egulias\EmailValidator\Validation; namespace Egulias\EmailValidator\Validation;
use Egulias\EmailValidator\EmailLexer; use Egulias\EmailValidator\EmailLexer;
use Egulias\EmailValidator\Exception\InvalidEmail;
use Egulias\EmailValidator\Validation\Error\RFCWarnings;
class NoRFCWarningsValidation extends RFCValidation class NoRFCWarningsValidation extends RFCValidation
{ {
/**
* @var InvalidEmail
*/
private $error;
/**
* {@inheritdoc}
*/
public function isValid($email, EmailLexer $emailLexer) public function isValid($email, EmailLexer $emailLexer)
{ {
return parent::isValid($email, $emailLexer) && empty($this->getWarnings()); if (!parent::isValid($email, $emailLexer)) {
return false;
}
if (empty($this->getWarnings())) {
return true;
}
$this->error = new RFCWarnings();
return false;
}
/**
* {@inheritdoc}
*/
public function getError()
{
return $this->error ?: parent::getError();
} }
} }
+8 -4
View File
@@ -1,9 +1,13 @@
#EmailValidator #EmailValidator
[![Build Status](https://travis-ci.org/egulias/EmailValidator.png?branch=master)](https://travis-ci.org/egulias/EmailValidator) [![Coverage Status](https://coveralls.io/repos/egulias/EmailValidator/badge.png?branch=master)](https://coveralls.io/r/egulias/EmailValidator?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/egulias/EmailValidator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/egulias/EmailValidator/?branch=master) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6/small.png)](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6) [![Build Status](https://travis-ci.org/egulias/EmailValidator.png?branch=master)](https://travis-ci.org/egulias/EmailValidator) [![Coverage Status](https://coveralls.io/repos/egulias/EmailValidator/badge.png?branch=master)](https://coveralls.io/r/egulias/EmailValidator?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/egulias/EmailValidator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/egulias/EmailValidator/?branch=master) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6/small.png)](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6)
============================= =============================
With the help of With the help of [PHPStorm](https://www.jetbrains.com/phpstorm/)
##Requirements##
* [Composer](https://getcomposer.org) is required for installation
* [Spoofchecking](https://github.com/egulias/EmailValidator/blob/master/EmailValidator/Validation/SpoofCheckValidation.php) validation requires that your PHP system have the [PHP Internationalization Libraries](http://php.net/manual/en/book.intl.php) (also known as PHP Intl)
![Powered by PhpStorm](https://www.jetbrains.com/phpstorm/documentation/docs/logo_phpstorm.png)
##Installation## ##Installation##
Run the command below to install via Composer Run the command below to install via Composer
@@ -51,8 +55,8 @@ $validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([ $multipleValidations = new MultipleValidationWithAnd([
new RFCValidation(), new RFCValidation(),
new DNSCheckValidation() new DNSCheckValidation()
]) ]);
$validator->isValid("example@example.com", $multipleValidations) //true $validator->isValid("example@example.com", $multipleValidations); //true
``` ```
###How to extend### ###How to extend###
@@ -25,13 +25,26 @@ class MultipleValidationWitAndTest extends \PHPUnit_Framework_TestCase
} }
/** /**
* @expectedException Egulias\EmailValidator\Validation\Exception\EmptyValidationList * @expectedException \Egulias\EmailValidator\Validation\Exception\EmptyValidationList
*/ */
public function testEmptyListIsNotAllowed() public function testEmptyListIsNotAllowed()
{ {
new MultipleValidationWithAnd([]); new MultipleValidationWithAnd([]);
} }
public function testValidationIsValid()
{
$lexer = $this->getMock("Egulias\\EmailValidator\\EmailLexer");
$validation = $this->getMock("Egulias\\EmailValidator\\Validation\\EmailValidation");
$validation->expects($this->any())->method("isValid")->willReturn(true);
$validation->expects($this->once())->method("getWarnings")->willReturn([]);
$multipleValidation = new MultipleValidationWithAnd([$validation]);
$this->assertTrue($multipleValidation->isValid("example@example.com", $lexer));
$this->assertNull($multipleValidation->getError());
}
public function testAccumulatesWarnings() public function testAccumulatesWarnings()
{ {
$warnings1 = [ $warnings1 = [
@@ -79,4 +92,27 @@ class MultipleValidationWitAndTest extends \PHPUnit_Framework_TestCase
$multipleValidation->isValid("example@example.com", $lexer); $multipleValidation->isValid("example@example.com", $lexer);
$this->assertEquals($expectedResult, $multipleValidation->getError()); $this->assertEquals($expectedResult, $multipleValidation->getError());
} }
public function testBreakOutOfLoopWhenError()
{
$error = new CommaInDomain();
$expectedResult = new MultipleErrors([$error]);
$lexer = $this->getMock("Egulias\\EmailValidator\\EmailLexer");
$validation1 = $this->getMock("Egulias\\EmailValidator\\Validation\\EmailValidation");
$validation1->expects($this->any())->method("isValid")->willReturn(false);
$validation1->expects($this->once())->method("getWarnings")->willReturn([]);
$validation1->expects($this->once())->method("getError")->willReturn($error);
$validation2 = $this->getMock("Egulias\\EmailValidator\\Validation\\EmailValidation");
$validation2->expects($this->never())->method("isValid");
$validation2->expects($this->never())->method("getWarnings");
$validation2->expects($this->never())->method("getError");
$multipleValidation = new MultipleValidationWithAnd([$validation1, $validation2], MultipleValidationWithAnd::STOP_ON_ERROR);
$multipleValidation->isValid("example@example.com", $lexer);
$this->assertEquals($expectedResult, $multipleValidation->getError());
}
} }
@@ -0,0 +1,35 @@
<?php
namespace Egulias\Tests\EmailValidator\Validation;
use Egulias\EmailValidator\EmailLexer;
use Egulias\EmailValidator\Exception\NoDomainPart;
use Egulias\EmailValidator\Validation\Error\RFCWarnings;
use Egulias\EmailValidator\Validation\NoRFCWarningsValidation;
class NoRFCWarningsValidationTest extends \PHPUnit_Framework_TestCase
{
public function testInvalidEmailIsInvalid()
{
$validation = new NoRFCWarningsValidation();
$this->assertFalse($validation->isValid('non-email-string', new EmailLexer()));
$this->assertInstanceOf(NoDomainPart::class, $validation->getError());
}
public function testEmailWithWarningsIsInvalid()
{
$validation = new NoRFCWarningsValidation();
$this->assertFalse($validation->isValid(str_repeat('x', 254).'@example.com', new EmailLexer())); // too long email
$this->assertInstanceOf(RFCWarnings::class, $validation->getError());
}
public function testEmailWithoutWarningsIsValid()
{
$validation = new NoRFCWarningsValidation();
$this->assertTrue($validation->isValid('example@example.com', new EmailLexer()));
$this->assertNull($validation->getError());
}
}
@@ -1,23 +0,0 @@
<?php
namespace Egulias\Tests\EmailValidator\Validation;
use Egulias\EmailValidator\EmailLexer;
use Egulias\EmailValidator\Validation\NoRFCWarningsValidation;
class NoWarningsRFCValidationTest extends \PHPUnit_Framework_TestCase
{
public function testEmailWithWarningsIsInvalid()
{
$validation = new NoRFCWarningsValidation();
$this->assertFalse($validation->isValid('examp"l"e@example.com', new EmailLexer()));
}
public function testEmailWithoutWarningsIsValid()
{
$validation = new NoRFCWarningsValidation();
$this->assertTrue($validation->isValid('example@example.com', new EmailLexer()));
}
}
+3
View File
@@ -28,6 +28,9 @@
"phpunit/phpunit": "^4.8.0", "phpunit/phpunit": "^4.8.0",
"dominicsayers/isemail": "dev-master" "dominicsayers/isemail": "dev-master"
}, },
"suggest": {
"ext/php-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Egulias\\EmailValidator\\": "EmailValidator" "Egulias\\EmailValidator\\": "EmailValidator"