117 lines
2.8 KiB
PHP
117 lines
2.8 KiB
PHP
<?php
|
|
/*
|
|
* This file is part of DbUnit.
|
|
*
|
|
* (c) Sebastian Bergmann <sebastian@phpunit.de>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace PHPUnit\DbUnit\DataSet;
|
|
|
|
/**
|
|
* Creates YamlDataSets.
|
|
*
|
|
* You can incrementally add YAML files as tables to your datasets
|
|
*/
|
|
class YamlDataSet extends AbstractDataSet
|
|
{
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $tables = [];
|
|
|
|
/**
|
|
* @var IYamlParser
|
|
*/
|
|
protected $parser;
|
|
|
|
/**
|
|
* Creates a new YAML dataset
|
|
*
|
|
* @param string $yamlFile
|
|
* @param IYamlParser $parser
|
|
*/
|
|
public function __construct($yamlFile, $parser = null)
|
|
{
|
|
if ($parser == null) {
|
|
$parser = new SymfonyYamlParser();
|
|
}
|
|
$this->parser = $parser;
|
|
$this->addYamlFile($yamlFile);
|
|
}
|
|
|
|
/**
|
|
* Adds a new yaml file to the dataset.
|
|
*
|
|
* @param string $yamlFile
|
|
*/
|
|
public function addYamlFile($yamlFile)
|
|
{
|
|
$data = $this->parser->parseYaml($yamlFile);
|
|
|
|
foreach ($data as $tableName => $rows) {
|
|
if (!isset($rows)) {
|
|
$rows = [];
|
|
}
|
|
|
|
if (!is_array($rows)) {
|
|
continue;
|
|
}
|
|
|
|
if (!array_key_exists($tableName, $this->tables)) {
|
|
$columns = $this->getColumns($rows);
|
|
|
|
$tableMetaData = new DefaultTableMetadata(
|
|
$tableName, $columns
|
|
);
|
|
|
|
$this->tables[$tableName] = new DefaultTable(
|
|
$tableMetaData
|
|
);
|
|
}
|
|
|
|
foreach ($rows as $row) {
|
|
$this->tables[$tableName]->addRow($row);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates a unique list of columns from all the rows in a table.
|
|
* If the table is defined another time in the Yaml, and if the Yaml
|
|
* parser could return the multiple occerrences, then this would be
|
|
* insufficient unless we grouped all the occurences of the table
|
|
* into onwe row set. sfYaml, however, does not provide multiple tables
|
|
* with the same name, it only supplies the last table.
|
|
*
|
|
* @params all the rows in a table.
|
|
*/
|
|
private function getColumns($rows)
|
|
{
|
|
$columns = [];
|
|
|
|
foreach ($rows as $row) {
|
|
$columns = array_merge($columns, array_keys($row));
|
|
}
|
|
|
|
return array_values(array_unique($columns));
|
|
}
|
|
|
|
/**
|
|
* Creates an iterator over the tables in the data set. If $reverse is
|
|
* true a reverse iterator will be returned.
|
|
*
|
|
* @param bool $reverse
|
|
*
|
|
* @return ITableIterator
|
|
*/
|
|
protected function createIterator($reverse = false)
|
|
{
|
|
return new DefaultTableIterator(
|
|
$this->tables, $reverse
|
|
);
|
|
}
|
|
}
|