diff --git a/src/Csv/Column.php b/src/Csv/Column.php index d873d784..3dc820a8 100644 --- a/src/Csv/Column.php +++ b/src/Csv/Column.php @@ -17,8 +17,8 @@ namespace JBZoo\CsvBlueprint\Csv; use JBZoo\CsvBlueprint\Utils; -use JBZoo\CsvBlueprint\Validators\ErrorSuite; use JBZoo\CsvBlueprint\Validators\ColumnValidator; +use JBZoo\CsvBlueprint\Validators\ErrorSuite; use JBZoo\Data\Data; final class Column diff --git a/src/Csv/CsvFile.php b/src/Csv/CsvFile.php index f7cdc64f..543ce522 100644 --- a/src/Csv/CsvFile.php +++ b/src/Csv/CsvFile.php @@ -17,8 +17,7 @@ namespace JBZoo\CsvBlueprint\Csv; use JBZoo\CsvBlueprint\Schema; -use JBZoo\CsvBlueprint\Utils; -use JBZoo\CsvBlueprint\Validators\Error; +use JBZoo\CsvBlueprint\Validators\CsvValidator; use JBZoo\CsvBlueprint\Validators\ErrorSuite; use League\Csv\Reader as LeagueReader; use League\Csv\Statement; @@ -81,17 +80,7 @@ public function getRecordsChunk(int $offset = 0, int $limit = -1): TabularDataRe public function validate(bool $quickStop = false): ErrorSuite { - // $fileValidator - - $errors = new ErrorSuite($this->getCsvFilename()); - - $errors - ->addErrorSuit($this->validateFile($quickStop)) - ->addErrorSuit($this->validateHeader($quickStop)) - ->addErrorSuit($this->validateEachCell($quickStop)) - ->addErrorSuit(self::validateAggregateRules($quickStop)); - - return $errors; + return (new CsvValidator($this, $this->schema))->validate($quickStop); } private function prepareReader(): LeagueReader @@ -110,93 +99,4 @@ private function prepareReader(): LeagueReader return $reader; } - - private function validateHeader(bool $quickStop = false): ErrorSuite - { - $errors = new ErrorSuite(); - - if (!$this->getCsvStructure()->isHeader()) { - return $errors; - } - - foreach ($this->schema->getColumns() as $column) { - if ($column->getName() === '') { - $error = new Error( - 'csv.header', - "Property \"name\" is not defined in schema: \"{$this->schema->getFilename()}\"", - $column->getHumanName(), - 1, - ); - - $errors->addError($error); - } - - if ($quickStop && $errors->count() > 0) { - return $errors; - } - } - - return $errors; - } - - private function validateEachCell(bool $quickStop = false): ErrorSuite - { - $errors = new ErrorSuite(); - - foreach ($this->getRecords() as $line => $record) { - $columns = $this->schema->getColumnsMappedByHeader($this->getHeader()); - - foreach ($columns as $column) { - if ($column === null) { - continue; - } - - $errors->addErrorSuit($column->validate($record[$column->getKey()], (int)$line + 1)); - if ($quickStop && $errors->count() > 0) { - return $errors; - } - } - } - - return $errors; - } - - private function validateFile(bool $quickStop = false): ErrorSuite - { - $errors = new ErrorSuite(); - - $filenamePattern = $this->schema->getFilenamePattern(); - if ( - $filenamePattern !== null - && $filenamePattern !== '' - && \preg_match($filenamePattern, $this->csvFilename) === 0 - ) { - $error = new Error( - 'filename_pattern', - 'Filename "' . Utils::cutPath($this->csvFilename) . - "\" does not match pattern: \"{$filenamePattern}\"", - '', - 0, - ); - - $errors->addError($error); - - if ($quickStop && $errors->count() > 0) { - return $errors; - } - } - - return $errors; - } - - private static function validateAggregateRules(bool $quickStop = false): ErrorSuite - { - $errors = new ErrorSuite(); - - if ($quickStop && $errors->count() > 0) { - return $errors; - } - - return new ErrorSuite(); - } } diff --git a/src/Validators/AbstractValidator.php b/src/Validators/AbstractValidator.php deleted file mode 100644 index de339246..00000000 --- a/src/Validators/AbstractValidator.php +++ /dev/null @@ -1,22 +0,0 @@ -csv = $csv; + $this->schema = $schema; + $this->errors = new ErrorSuite($this->csv->getCsvFilename()); + } + + public function validate(bool $quickStop = false): ErrorSuite + { + return $this->errors + ->addErrorSuit($this->validateFile($quickStop)) + ->addErrorSuit($this->validateHeader($quickStop)) + ->addErrorSuit($this->validateEachCell($quickStop)) + ->addErrorSuit(self::validateAggregateRules($quickStop)); + } + + private function validateHeader(bool $quickStop = false): ErrorSuite + { + $errors = new ErrorSuite(); + + if (!$this->schema->getCsvStructure()->isHeader()) { + return $errors; + } + + foreach ($this->schema->getColumns() as $column) { + if ($column->getName() === '') { + $error = new Error( + 'csv.header', + "Property \"name\" is not defined in schema: \"{$this->schema->getFilename()}\"", + $column->getHumanName(), + 1, + ); + + $errors->addError($error); + } + + if ($quickStop && $errors->count() > 0) { + return $errors; + } + } + + return $errors; + } + + private function validateEachCell(bool $quickStop = false): ErrorSuite + { + $errors = new ErrorSuite(); + + foreach ($this->csv->getRecords() as $line => $record) { + $columns = $this->schema->getColumnsMappedByHeader($this->csv->getHeader()); + + foreach ($columns as $column) { + if ($column === null) { + continue; + } + + $errors->addErrorSuit($column->validate($record[$column->getKey()], (int)$line + 1)); + if ($quickStop && $errors->count() > 0) { + return $errors; + } + } + } + + return $errors; + } + + private function validateFile(bool $quickStop = false): ErrorSuite + { + $errors = new ErrorSuite(); + + $filenamePattern = $this->schema->getFilenamePattern(); + if ( + $filenamePattern !== null + && $filenamePattern !== '' + && \preg_match($filenamePattern, $this->csv->getCsvFilename()) === 0 + ) { + $error = new Error( + 'filename_pattern', + 'Filename "' . Utils::cutPath($this->csv->getCsvFilename()) . + "\" does not match pattern: \"{$filenamePattern}\"", + '', + 0, + ); + + $errors->addError($error); + + if ($quickStop && $errors->count() > 0) { + return $errors; + } + } + + return $errors; + } + + private static function validateAggregateRules(bool $quickStop = false): ErrorSuite + { + $errors = new ErrorSuite(); + + if ($quickStop && $errors->count() > 0) { + return $errors; + } + + return new ErrorSuite(); + } +} diff --git a/src/Validators/ScvValidator.php b/src/Validators/ScvValidator.php deleted file mode 100644 index 7bdc0011..00000000 --- a/src/Validators/ScvValidator.php +++ /dev/null @@ -1,25 +0,0 @@ -