Skip to content

Commit

Permalink
Merge d02db20 into 40fb591
Browse files Browse the repository at this point in the history
  • Loading branch information
courtney-miles committed Sep 6, 2018
2 parents 40fb591 + d02db20 commit 866cf0c
Show file tree
Hide file tree
Showing 16 changed files with 395 additions and 112 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@
* Time: 9:59 PM
*/

namespace MilesAsylum\Slurp\Validate\Exception;
namespace MilesAsylum\Slurp\Exception;


use MilesAsylum\Slurp\Exception\ExceptionInterface;
use Throwable;

class UnknownFieldException extends \InvalidArgumentException implements ExceptionInterface
Expand Down
40 changes: 33 additions & 7 deletions src/SlurpBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@
namespace MilesAsylum\Slurp;

use League\Pipeline\PipelineBuilder;
use MilesAsylum\Slurp\Extract\ExtractorInterface;
use MilesAsylum\Slurp\Load\LoaderInterface;
use MilesAsylum\Slurp\Stage\FinaliseLoadStage;
use MilesAsylum\Slurp\Stage\InvokeExtractionPipeline;
use MilesAsylum\Slurp\Stage\LoadStage;
use MilesAsylum\Slurp\Stage\TransformationStage;
use MilesAsylum\Slurp\Stage\ValidationStage;
use MilesAsylum\Slurp\Transform\SlurpTransformer\Change;
use MilesAsylum\Slurp\Transform\Transformer;
use MilesAsylum\Slurp\Transform\SlurpTransformer\Transformer;
use MilesAsylum\Slurp\Transform\SlurpTransformer\TransformerLoader;
use MilesAsylum\Slurp\Validate\ConstraintValidation\ConstraintValidator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Validation;

class SlurpBuilder
{
Expand Down Expand Up @@ -48,24 +49,49 @@ class SlurpBuilder
protected $loadStages = [];

protected $preExtractionStages = [];

protected $postExtractionStages = [];

/**
* @var ConstraintValidator
*/
protected $constraintValidator;

/**
* @var Transformer
*/
protected $transformer;

public function __construct(PipelineBuilder $innerPipelineBuilder, PipelineBuilder $outerPipelineBuilder)
{
$this->innerPipelineBuilder = $innerPipelineBuilder;
$this->outerPipelineBuilder = $outerPipelineBuilder;
}

public function addConstraint($valueName, Constraint $constraint, ValidatorInterface $validator): self
public function addConstraint($field, Constraint $constraint): self
{
$this->validationStages[] = new ValidationStage($valueName, $constraint, $validator);
if (!isset($this->constraintValidator)) {
$this->constraintValidator = new ConstraintValidator(
Validation::createValidator()
);
}

$this->constraintValidator->addColumnConstraints($field, $constraint);

$this->validationStages[] = new ValidationStage($this->constraintValidator);

return $this;
}

public function addChange($valueName, Change $change, Transformer $transformer): self
public function addChange($valueName, Change $change): self
{
$this->transformationStages[] = new TransformationStage($valueName, $change, $transformer);
if (!isset($this->transformer)) {
$this->transformer = Transformer::createTransformer();
}

$this->transformer->setFieldChanges($valueName, $change);

$this->transformationStages[] = new TransformationStage($this->transformer);

return $this;
}
Expand Down
36 changes: 5 additions & 31 deletions src/Stage/TransformationStage.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,51 +8,25 @@
namespace MilesAsylum\Slurp\Stage;

use MilesAsylum\Slurp\SlurpPayload;
use MilesAsylum\Slurp\Transform\SlurpTransformer\Change;
use MilesAsylum\Slurp\Transform\SlurpTransformer\Transformer;
use MilesAsylum\Slurp\Transform\TransformerBork;
use MilesAsylum\Slurp\Transform\TransformerInterface;

class TransformationStage implements StageInterface
{
/**
* @var int|string
*/
private $valueName;

/**
* @var Change
*/
private $change;

/**
* @var TransformerBork
* @var TransformerInterface
*/
private $transformer;

public function __construct($valueName, Change $change, TransformerInterface $transformer)
public function __construct(TransformerInterface $transformer)
{
$this->valueName = $valueName;
$this->change = $change;
$this->transformer = $transformer;
}

public function __invoke(SlurpPayload $payload): SlurpPayload
{
if ($payload->hasValue($this->valueName)) {
if (!$payload->valueHasViolation($this->valueName)) {
$payload->replaceValue(
$this->valueName,
$this->transformer->transform(
$payload->getValue($this->valueName),
$this->change
)
);
}
} else {
trigger_error(
"A value named {$this->valueName} does not exist in the payload to validate.",
E_USER_NOTICE
if (!$payload->hasViolations()) {
$payload->setValues(
$this->transformer->transformRecord($payload->getValues())
);
}

Expand Down
16 changes: 16 additions & 0 deletions src/Transform/Exception/TransformationException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php
/**
* Author: Courtney Miles
* Date: 5/09/18
* Time: 6:58 PM
*/

namespace MilesAsylum\Slurp\Transform\Exception;


use MilesAsylum\Slurp\Exception\ExceptionInterface;

class TransformationException extends \Exception implements ExceptionInterface
{

}
73 changes: 73 additions & 0 deletions src/Transform/SchemaTransformer/SchemaTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php
/**
* Author: Courtney Miles
* Date: 4/09/18
* Time: 10:18 PM
*/

namespace MilesAsylum\Slurp\Transform\SchemaTransformer;

use frictionlessdata\tableschema\Schema;
use MilesAsylum\Slurp\Exception\UnknownFieldException;
use MilesAsylum\Slurp\Transform\Exception\TransformationException;
use MilesAsylum\Slurp\Transform\TransformerInterface;

class SchemaTransformer implements TransformerInterface
{
/**
* @var Schema
*/
private $tableSchema;

public function __construct(Schema $tableSchema)
{
$this->tableSchema = $tableSchema;
}

/**
* @param $field
* @param $value
* @return mixed
* @throws TransformationException
*/
public function transformField($field, $value)
{
try {
$schemaField = $this->tableSchema->field($field);
} catch (\Exception $e) {
throw new UnknownFieldException($field, "Unknown field $field.");
}

try {
$value = $schemaField->castValue($value);
} catch (\Throwable $e) {
throw new TransformationException(
'An error occurred transforming a field:' . $e->getMessage(),
0,
$e
);
}

return $value;
}

/**
* @param array $record
* @return array|mixed[]
* @throws TransformationException
*/
public function transformRecord(array $record): array
{
try {
$record = $this->tableSchema->castRow($record);
} catch (\Throwable $e) {
throw new TransformationException(
'An error occurred transforming a record: ' . $e->getMessage(),
0,
$e
);
}

return $record;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
namespace MilesAsylum\Slurp\Transform\SlurpTransformer;


use MilesAsylum\Slurp\Transform\ChangeTransformerInterface;
use MilesAsylum\Slurp\Transform\SlurpTransformer\ChangeTransformerInterface;

abstract class AbstractChangeTransformer implements ChangeTransformerInterface
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
* Time: 10:53 PM
*/

namespace MilesAsylum\Slurp\Transform;

use MilesAsylum\Slurp\Transform\SlurpTransformer\Change;
namespace MilesAsylum\Slurp\Transform\SlurpTransformer;

interface ChangeTransformerInterface
{
Expand Down
56 changes: 51 additions & 5 deletions src/Transform/SlurpTransformer/Transformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

namespace MilesAsylum\Slurp\Transform\SlurpTransformer;

use MilesAsylum\Slurp\Transform\SlurpTransformer\Change;
use MilesAsylum\Slurp\Exception\UnknownFieldException;
use MilesAsylum\Slurp\Transform\Exception\UnexpectedTypeException;
use MilesAsylum\Slurp\Transform\TransformerInterface;
use MilesAsylum\Slurp\Transform\SlurpTransformer\TransformerLoader;

class Transformer implements TransformerInterface
{
Expand All @@ -18,6 +18,11 @@ class Transformer implements TransformerInterface
*/
private $loader;

/**
* @var Change[][]
*/
private $fieldChanges = [];

public function __construct(TransformerLoader $loader)
{
$this->loader = $loader;
Expand All @@ -28,9 +33,50 @@ public static function createTransformer()
return new self(new TransformerLoader());
}

public function transform($value, Change $change)
public function setFieldChanges($field, $changes)
{
unset($this->fieldChanges[$field]);

if (!is_array($changes)) {
$changes = [$changes];
}

foreach ($changes as $change) {
if (!$change instanceof Change) {
throw UnexpectedTypeException::createUnexpected($change, Change::class);
}

$this->fieldChanges[$field][] = $change;
}
}

public function transformField($field, $value)
{
if (!isset($this->fieldChanges[$field])) {
throw new UnknownFieldException($field, "Unknown field $field");
}

foreach ($this->fieldChanges[$field] as $change) {
$value = $this->loader->loadTransformer($change)
->transform($value, $change);
}

return $value;
}

public function transformRecord(array $record): array
{
return $this->loader->loadTransformer($change)
->transform($value, $change);
foreach ($this->fieldChanges as $field => $changes) {
if (!isset($record[$field])) {
return null;
}

foreach ($changes as $change) {
$record[$field] = $this->loader->loadTransformer($change)
->transform($record[$field], $change);
}
}

return $record;
}
}
2 changes: 1 addition & 1 deletion src/Transform/SlurpTransformer/TransformerLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace MilesAsylum\Slurp\Transform\SlurpTransformer;

use MilesAsylum\Slurp\Transform\ChangeTransformerInterface;
use MilesAsylum\Slurp\Transform\SlurpTransformer\ChangeTransformerInterface;
use MilesAsylum\Slurp\Transform\SlurpTransformer\Change;

class TransformerLoader
Expand Down
6 changes: 3 additions & 3 deletions src/Transform/TransformerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

namespace MilesAsylum\Slurp\Transform;

use MilesAsylum\Slurp\Transform\SlurpTransformer\Change;

interface TransformerInterface
{
public function transform($value, Change $change);
public function transformField($field, $value);

public function transformRecord(array $record): array;
}
19 changes: 13 additions & 6 deletions src/Validate/SchemaValidation/SchemaValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

use frictionlessdata\tableschema\Schema;
use frictionlessdata\tableschema\SchemaValidationError;
use MilesAsylum\Slurp\Validate\Exception\UnknownFieldException;
use MilesAsylum\Slurp\Exception\UnknownFieldException;
use MilesAsylum\Slurp\Validate\ValidatorInterface;
use MilesAsylum\Slurp\Validate\Violation;

Expand Down Expand Up @@ -41,9 +41,9 @@ public function validateField($recordId, $field, $value): array
$schemaValidationErrors = $schemaField->validateValue($value);

if (!empty($schemaValidationErrors)) {
/** @var SchemaValidationError $validationError */
foreach ($schemaValidationErrors as $validationError) {
$violations[] = new Violation($recordId, $field, $value, $validationError->getMessage());
/** @var SchemaValidationError $schemaError */
foreach ($schemaValidationErrors as $schemaError) {
$violations[] = new Violation($recordId, $field, $value, $schemaError->getMessage());
}
}

Expand All @@ -57,8 +57,15 @@ public function validateRecord($recordId, array $record): array
{
$violations = [];

foreach ($record as $field => $value) {
$violations = array_merge($violations, $this->validateField($recordId, $field, $value));
$schemaValidationErrors = $this->tableSchema->validateRow($record);

foreach ($schemaValidationErrors as $schemaError) {
$violations[] = new Violation(
$recordId,
$schemaError->extraDetails['field'],
$schemaError->extraDetails['value'],
$schemaError->getMessage()
);
}

return $violations;
Expand Down

0 comments on commit 866cf0c

Please sign in to comment.