Skip to content

shapintv/datagen

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

75 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Datagen

Latest Version Build Status Code Coverage Quality Score Total Downloads

Datagen is a PHP library to deal with fixtures loading.

Installation

The recommended way to install Datagen is through Composer. Require the shapin/datagen package:

$ composer require shapin/datagen

Usage

The main entrypoint is the Shapin\Datagen\Datagen class and its load method.

use Doctrine\DBAL\DriverManager;
use Shapin\Stripe\StripeClient;
use Symfony\Component\HttpClient\HttpClient;

use Shapin\Datagen\Datagen;
use Shapin\Datagen\DBAL\Processor as DBALProcessor;
use Shapin\Datagen\Loader;
use Shapin\Datagen\Stripe\Processor as StripeProcessor;
use Shapin\Datagen\ReferenceManager;

// Create a Loader for your fixtures
$loader = new Loader();
$loader->addFixture(new MyAwesomeFixture(), ['group1', 'group2']);
$loader->addFixture(new AnotherAwesomeFixture()); // Groups are faculative

$referenceManager = new ReferenceManager();

$connectionParams = [
    'dbname' => 'testDB',
    'user' => 'user',
    'password' => 'pass',
    'host' => 'localhost',
    'driver' => 'pdo_mysql',
];
$connection = DriverManager::getConnection($connectionParams);

$httpClient = HttpClient::create([
    'base_uri' => 'http://127.0.0.1:12111/v1/',
    'auth_bearer' => 'api_key',
    'headers' => [
        'Content-Type' => 'application/json',
    ],
]);
$stripeClient = new StripeClient($httpClient);

// Create your processors (see next section for more information regarding supported fixtures)
$processors = [
    new DBALProcessor($connection, $referenceManager),
    new StripeProcessor($stripeClient, $referenceManager),
];

// Create a Datagen
$datagen = new Datagen($loader, $processors);

// Load everything!
$datagen->load();

Symfony

This library contains a bundle in order to integrate seamlessly with Symfony. For now, there isn't any symfony recipe so you'll need to manually register the bundle into your Kernel:

    public function registerBundles()
    {
        $contents = require $this->getProjectDir().'/config/bundles.php';
        foreach ($contents as $class => $envs) {
            if ($envs[$this->environment] ?? $envs['all'] ?? false) {
                yield new $class();
            }
        }

        // No symfony recipe (yet) for Datagen
        if (in_array($this->environment, ['dev', 'test'])) {
            yield new \Shapin\Datagen\Bridge\Symfony\Bundle\ShapinDatagenBundle();
        }
    }

Once registered, you'll have access to new commands in order to play with datagen.

Creating fixtures

DBAL

In order to create a table and hydrate it, extends the Table base class:

<?php

use Shapin\Datagen\DBAL\Table;
use Doctrine\DBAL\Schema\Schema;
use Ramsey\Uuid\Uuid;

class Category extends Table
{
    protected static $tableName = 'category';
    protected static $order = 15;

    /**
     * {@inheritdoc}
     */
    public function addTableToSchema(Schema $schema)
    {
        $table = $schema->createTable(self::$tableName);
        $table->addColumn('id', 'uuid');
        $table->addColumn('name', 'string');
        $table->addColumn('description', 'text', ['notnull' => false]);

        $table->setPrimaryKey(['id']);
    }

    /**
     * {@inheritdoc}
     */
    public function getRows(): iterable
    {
        yield 'category_1' => [
            'id' => Uuid::uuid4(),
            'name' => 'Category 1',
            'description' => 'My awesome first category',
        ];

        yield 'another_category' => [
            'id' => Uuid::uuid4(),
            'name' => 'Another category',
        ];
    }
}

Stripe

In order to create fixtures for Stripe, you'll need to use shapintv/stripe library.

For example, if you want to create a product:

<?php

use Shapin\Datagen\Stripe\Fixture;

class StripeProduct extends Fixture
{
    protected static $order = 30;

    /**
     * {@inheritdoc}
     */
    public function getObjectName(): string
    {
        return 'product';
    }

    /**
     * {@inheritdoc}
     */
    public function getObjects(): iterable
    {
        yield 'my_product' => [
            'id' => 'my_product',
            'name' => 'This is my product!',
            'type' => 'product',
        ];
    }
}

And so much more!

Groups

When adding your fixtures to the Loader, you can use the second argument to specify some groups. When launching the Datagen::load method, you can specify which groups you want to include and/or to exclude.

// Load everything
$datagen->load();
// Load only fixtures from a given group
$datagen->load(['group1']);
// Do not load fixtures from a given group
$datagen->load([], ['group2']);
// Load all fixtures from group 1, ignoring group2. If a fixture is in both group, it will be ignored.
$datagen->load(['group1'], ['group2']);

References

You can (and should!) name all your fixtures in order to be allowed to use them elsewhere.

<?php

use Doctrine\DBAL\Schema\Schema;
use Shapin\Datagen\DBAL\Table;
use Ramsey\Uuid\Uuid;

class Category extends Table
{
    protected static $tableName = 'category';
    protected static $order = 15;

    /**
     * {@inheritdoc}
     */
    public function addTableToSchema(Schema $schema)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function getRows(): iterable
    {
        // This fixture is not named and won't be referencable.
        yield [
            'id' => Uuid::uuid4(),
            'name' => 'Dead category',
        ];

        // The name of this fixture is "category_1". We'll use it later!
        yield 'category_1' => [
            'id' => Uuid::uuid4(),
            'name' => 'Category 1',
            'description' => 'My awesome first category',
        ];
    }
}

class Subcategory extends Table
{
    protected static $tableName = 'subcategory';
    protected static $order = 25;

    /**
     * {@inheritdoc}
     */
    public function addTableToSchema(Schema $schema)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function getRows(): iterable
    {
        yield 'subcategory_1' => [
            'id' => Uuid::uuid4(),
            'category_id' => 'REF:category.category_1.id', // Here is our reference!
            'name' => 'Subcategory 1',
        ];
    }
}

License

Datagen is released under the MIT License. See the bundled LICENSE file for details.

About

Deal with DB & fixtures

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published