First basic working version
This commit is contained in:
parent
9d5e6ca018
commit
ee310bd580
8 changed files with 1412 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
vendor
|
12
app
Executable file
12
app
Executable file
|
@ -0,0 +1,12 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
namespace DSiepmann;
|
||||
|
||||
require __DIR__ . '/vendor/autoload.php';
|
||||
|
||||
use Symfony\Component\Console\Application;
|
||||
|
||||
$application = new Application();
|
||||
$application->add(new Command\FakeMysqlCommand());
|
||||
$application->run();
|
24
composer.json
Normal file
24
composer.json
Normal file
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"name": "DSiepmann\\faker",
|
||||
"description": "Insert fake data into MySQL Table using PHP Edit",
|
||||
"type": "project",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Daniel Siepmann",
|
||||
"email": "coding@daniel-siepmann.de",
|
||||
"homepage": "https://daniel-siepmann.de",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"DSiepmann\\": "src"
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
"fzaninotto/faker": "^1.6",
|
||||
"symfony/console": "^3.2",
|
||||
"doctrine/dbal": "^2.5",
|
||||
"symfony/yaml": "^3.2"
|
||||
}
|
||||
}
|
1125
composer.lock
generated
Normal file
1125
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
19
configs/typo3_downloads.yml
Normal file
19
configs/typo3_downloads.yml
Normal file
|
@ -0,0 +1,19 @@
|
|||
database:
|
||||
dbname: typo3_git_62
|
||||
user: root
|
||||
password:
|
||||
host: localhost
|
||||
unix_socket: /tmp/mysql.sock
|
||||
driver: pdo_mysql
|
||||
|
||||
data:
|
||||
pid:
|
||||
type: static
|
||||
value: 1
|
||||
count:
|
||||
type: static
|
||||
value: 1
|
||||
name:
|
||||
type: userfunc
|
||||
class: DSiepmann\Userfunction\RepeatingFilenames
|
||||
method: filename
|
76
readme.rst
Normal file
76
readme.rst
Normal file
|
@ -0,0 +1,76 @@
|
|||
.. _highlight: bash
|
||||
|
||||
About
|
||||
=====
|
||||
|
||||
Small wrapper around `faker`_ and `Doctrine DBAL`_ to seed MySQL Tables with dummy data.
|
||||
|
||||
Because no other found solution did work out of the box.
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
Run::
|
||||
|
||||
composer update
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
Provide a configuration somewhere, containing necessary database connection information and data
|
||||
seed information.
|
||||
|
||||
Call ``fake:mysql`` with configuration file and table name::
|
||||
|
||||
./app fake:mysql configs/typo3_downloads.yml tx_downloadcounter_domain_model_download
|
||||
|
||||
An example file is provided.
|
||||
|
||||
Userfunctions
|
||||
=============
|
||||
|
||||
You can define custom PHP Code to provide information for each column.
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
The configuration has two sections, ``database`` and ``data``.
|
||||
|
||||
``database`` is just a plain key-value array passed to doctrines dbal. So take a look at
|
||||
http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html for
|
||||
further information.
|
||||
|
||||
``data`` is a key-value pair of column names and information which data to use. The structure is
|
||||
like the following:
|
||||
|
||||
.. code:: yml
|
||||
|
||||
pid:
|
||||
type: static
|
||||
|
||||
Where ``pid`` is the column name and ``type`` defines how to get the data to use. The following
|
||||
types are supported:
|
||||
|
||||
``static``
|
||||
Uses the value of ``value`` as static value.
|
||||
E.g.:
|
||||
|
||||
.. code:: yml
|
||||
|
||||
pid:
|
||||
type: static
|
||||
value: 1
|
||||
|
||||
``userfunc``
|
||||
Uses a user defined function defined by ``class`` and ``method``.
|
||||
|
||||
.. code:: yml
|
||||
|
||||
name:
|
||||
type: userfunc
|
||||
class: DSiepmann\Userfunction\RepeatingFilenames
|
||||
method: filename
|
||||
|
||||
|
||||
.. _faker: https://github.com/fzaninotto/Faker
|
||||
.. _Doctrine DBAL: http://www.doctrine-project.org/projects/dbal.html
|
126
src/Command/FakeMysqlCommand.php
Normal file
126
src/Command/FakeMysqlCommand.php
Normal file
|
@ -0,0 +1,126 @@
|
|||
<?php
|
||||
namespace DSiepmann\Command;
|
||||
|
||||
use Doctrine\DBAL;
|
||||
use Faker\Factory as Faker;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Yaml\Yaml;
|
||||
|
||||
class FakeMysqlCommand extends Command
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
* @var Faker\Generator
|
||||
*/
|
||||
protected $faker;
|
||||
|
||||
/**
|
||||
* @var Dbal\Connection
|
||||
*/
|
||||
protected $connection;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $userfunctions = [];
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('fake:mysql')
|
||||
->setDescription('Fake MySQL Data.')
|
||||
|
||||
->addOption('number', null, InputOption::VALUE_REQUIRED, 'How many fake data should be generated.', 200)
|
||||
|
||||
->addArgument('config', InputArgument::REQUIRED, 'The configuration file to use.')
|
||||
->addArgument('tableName', InputArgument::REQUIRED, 'The name of the Mysql Table.')
|
||||
;
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$this->config = Yaml::parse(file_get_contents($input->getArgument('config')));
|
||||
$this->faker = Faker::create();
|
||||
$this->connection = DBAL\DriverManager::getConnection($this->config['database'], new DBAL\Configuration());
|
||||
|
||||
$this->truncateTable($input->getArgument('tableName'));
|
||||
$output->writeLn('<info>Table ' . $input->getArgument('tableName') . ' was truncated.</info>');
|
||||
|
||||
foreach (range(1, $input->getOption('number')) as $number) {
|
||||
$this->connection->insert(
|
||||
$input->getArgument('tableName'),
|
||||
$this->getData($input->getArgument('tableName'))
|
||||
);
|
||||
|
||||
$output->writeLn('<info>Inserting record number: ' . $number . '.</info>');
|
||||
// if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
|
||||
// $output->writeLn('<info>With data: ' . var_export($data, true) . '</info>');
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
protected function truncateTable($tableName)
|
||||
{
|
||||
$platform = $this->connection->getDatabasePlatform();
|
||||
$this->connection->executeUpdate($platform->getTruncateTableSQL($tableName, false));
|
||||
}
|
||||
|
||||
protected function getData($tableName)
|
||||
{
|
||||
$data = [];
|
||||
|
||||
foreach ($this->connection->getSchemaManager()->listTableColumns($tableName) as $name => $column) {
|
||||
$columnData = $this->getColumnData($name, $column);
|
||||
if ($columnData !== null) {
|
||||
$data[$name] = $columnData;
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
protected function getColumnData($name, DBAL\Schema\Column $column)
|
||||
{
|
||||
if ($column->getAutoincrement()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($this->config['data'][$name])) {
|
||||
return $this->getConfiguredColumnData($this->config['data'][$name]);
|
||||
}
|
||||
|
||||
if (is_callable([$this->faker, $column->getType()])) {
|
||||
return call_user_func([$this->faker, $column->getType()]);
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
protected function getConfiguredColumnData($config)
|
||||
{
|
||||
if ($config['type'] === 'static') {
|
||||
return $config['value'];
|
||||
}
|
||||
|
||||
if ($config['type'] === 'userfunc') {
|
||||
if (! isset($this->userfunc[$config['class']])) {
|
||||
$this->userfunc[$config['class']] = new $config['class'];
|
||||
}
|
||||
|
||||
$userfunction = $this->userfunc[$config['class']];
|
||||
$userMethod = $config['method'];
|
||||
|
||||
return $userfunction->$userMethod();
|
||||
}
|
||||
|
||||
throw new \Exception('Unkown configured value.', 1486135949);
|
||||
}
|
||||
}
|
29
src/Userfunction/RepeatingFilenames.php
Normal file
29
src/Userfunction/RepeatingFilenames.php
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
namespace DSiepmann\Userfunction;
|
||||
|
||||
use Faker\Factory as Faker;
|
||||
|
||||
class RepeatingFilenames
|
||||
{
|
||||
protected $fileExtensions = ['jpg', 'png', 'pdf'];
|
||||
protected $fileNames = [];
|
||||
|
||||
/**
|
||||
* @var Faker\Generator
|
||||
*/
|
||||
protected $faker;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->faker = Faker::create();
|
||||
foreach (range(0, 12) as $number) {
|
||||
$this->fileNames[] = $this->faker->word . '.' . $this->faker->randomElement($this->fileExtensions);
|
||||
}
|
||||
}
|
||||
|
||||
public function filename()
|
||||
{
|
||||
return $this->faker->randomElement($this->fileNames);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue