diff --git a/src/Faker/ORM/Mandango/ColumnTypeGuesser.php b/src/Faker/ORM/Mandango/ColumnTypeGuesser.php new file mode 100644 index 00000000..449423dd --- /dev/null +++ b/src/Faker/ORM/Mandango/ColumnTypeGuesser.php @@ -0,0 +1,35 @@ +generator = $generator; + } + + public function guessFormat($field) + { + $generator = $this->generator; + switch ($field['type']) { + case 'boolean': + return function() use ($generator) { return $generator->boolean; }; + case 'integer': + return function() { return mt_rand(0,4294967295); }; + case 'float': + return function() { return mt_rand(0,4294967295)/mt_rand(1,4294967295); }; + case 'string': + return function() use ($generator) { return $generator->text(255); }; + case 'string': + return function() use ($generator) { return $generator->text; }; + case 'date': + return function() use ($generator) { return $generator->datetime; }; + default: + // no smart way to guess what the user expects here + return null; + } + } +} diff --git a/src/Faker/ORM/Mandango/EntityPopulator.php b/src/Faker/ORM/Mandango/EntityPopulator.php new file mode 100644 index 00000000..51e33fd0 --- /dev/null +++ b/src/Faker/ORM/Mandango/EntityPopulator.php @@ -0,0 +1,112 @@ +class = $class; + } + + public function getClass() + { + return $this->class; + } + + public function setColumnFormatters($columnFormatters) + { + $this->columnFormatters = $columnFormatters; + } + + public function getColumnFormatters() + { + return $this->columnFormatters; + } + + public function mergeColumnFormattersWith($columnFormatters) + { + $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters); + } + + public function guessColumnFormatters(\Faker\Generator $generator, Mandango $mandango) + { + $formatters = array(); + $nameGuesser = new \Faker\Guesser\Name($generator); + $columnTypeGuesser = new \Faker\ORM\Mandango\ColumnTypeGuesser($generator); + + $metadata = $mandango->getMetadata($this->class); + + // fields + foreach ($metadata['fields'] as $fieldName => $field) { + if ($formatter = $nameGuesser->guessFormat($fieldName)) { + $formatters[$fieldName] = $formatter; + continue; + } + if ($formatter = $columnTypeGuesser->guessFormat($field)) { + $formatters[$fieldName] = $formatter; + continue; + } + } + + // references + foreach (array_merge($metadata['referencesOne'], $metadata['referencesMany']) as $referenceName => $reference) { + if (!isset($reference['class'])) { + continue; + } + $referenceClass = $reference['class']; + + $formatters[$referenceName] = function ($insertedEntities) use ($referenceClass) { + if (isset($insertedEntities[$referenceClass])) { + return $insertedEntities[$referenceClass][array_rand($insertedEntities[$referenceClass])]; + } + }; + } + + return $formatters; + } + + /** + * Insert one new record using the Entity class. + */ + public function execute(Mandango $mandango, $insertedEntities) + { + $metadata = $mandango->getMetadata($this->class); + + $obj = $mandango->create($this->class); + foreach ($this->columnFormatters as $column => $format) { + if (null !== $format) { + $value = is_callable($format) ? $format($insertedEntities, $obj) : $format; + + if ( + isset($metadata['fields'][$column]) + || + isset($metadata['referencesOne'][$column]) + ) { + $obj->set($column, $value); + } + + if (isset($metadata['referencesMany'][$column])) { + $adder = 'add'.ucfirst($column); + $obj->$adder($value); + } + } + } + $mandango->persist($obj); + + return $obj; + } +} diff --git a/src/Faker/ORM/Mandango/Populator.php b/src/Faker/ORM/Mandango/Populator.php new file mode 100644 index 00000000..0fb7e6c1 --- /dev/null +++ b/src/Faker/ORM/Mandango/Populator.php @@ -0,0 +1,61 @@ +generator = $generator; + $this->mandango = $mandango; + } + + /** + * Add an order for the generation of $number records for $entity. + * + * @param mixed $entity A Propel ActiveRecord classname, or a \Faker\ORM\Propel\EntityPopulator instance + * @param int $number The number of entities to populate + */ + public function addEntity($entity, $number, $customColumnFormatters = array()) + { + if (!$entity instanceof \Faker\ORM\Mandango\EntityPopulator) { + $entity = new \Faker\ORM\Mandango\EntityPopulator($entity); + } + $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator, $this->mandango)); + if ($customColumnFormatters) { + $entity->mergeColumnFormattersWith($customColumnFormatters); + } + $class = $entity->getClass(); + $this->entities[$class] = $entity; + $this->quantities[$class] = $number; + } + + /** + * Populate the database using all the Entity classes previously added. + * + * @return array A list of the inserted entities. + */ + public function execute() + { + $insertedEntities = array(); + foreach ($this->quantities as $class => $number) { + for ($i=0; $i < $number; $i++) { + $insertedEntities[$class][]= $this->entities[$class]->execute($this->mandango, $insertedEntities); + } + } + $this->mandango->flush(); + + return $insertedEntities; + } +}