memio/spec-gen
Memio SpecGen is a PhpSpec extension that auto-generates constructors and methods from your specs, adding type-hinted arguments, sensible variable names, collision-safe numbering, and constructor properties/assignments.
This extension for phpspec provides a powerful code generator:
Interface suffix from names)argument)$argument1, $argument2)Note: Currently it is not possible to provide custom templates to SpecGen (it is not compatible with phpspec templates).
First install it using Composer:
composer require --dev memio/spec-gen:^0.10.1
Then enable it in phpspec.yml:
extensions:
Memio\SpecGen\MemioSpecGenExtension: ~
Version guide:
- using phpspec 6? Then use spec-gen v0.10
- using phpspec 5? Then use spec-gen v0.9
- using phpspec 4? Then use spec-gen v0.8
- using phpspec 3 and PHP 7? Then use spec-gen v0.7
- using phpspec 3 and PHP 5.6? Then use spec-gen v0.6
- using phpspec 2? Then use spec-gen v0.4
Let's write the following specification:
<?php
namespace spec\Vendor\Project;
use Vendor\Project\Service\Filesystem;
use Vendor\Project\File;
use PhpSpec\ObjectBehavior;
class TextEditorSpec extends ObjectBehavior
{
const FILENAME = '/tmp/file.txt';
const FORCE_FILE_CREATION = true;
function let(Filesystem $filesystem)
{
$this->beConstructedWith($filesystem);
}
function it_creates_new_files(File $file, Filesystem $filesystem)
{
$filesystem->exists(self::FILENAME)->willReturn(false);
$filesystem->create(self::FILENAME)->willReturn($file);
$this->open(self::FILENAME, self::FORCE_FILE_CREATION)->shouldBe($file);
}
}
Executing the specifications (phpspec run) will generate the following class:
<?php
namespace Vendor\Project;
use Vendor\Project\Service\Filesystem;
class TextEditor
{
private $filesystem;
public function __construct(Filesytem $filesystem)
{
$this->filesystem = $filesystem;
}
public function open(string $argument1, bool $argument2)
{
}
}
Now we can start naming those generic arguments and write the code.
You can see the current and past versions using one of the following:
git tag commandAnd finally some meta documentation:
How can I help you explore Laravel packages today?