memio / spec-gen
phpspec extension for better code generation
Installs: 204 189
Dependents: 34
Suggesters: 0
Security: 0
Stars: 66
Watchers: 4
Forks: 10
Open Issues: 0
pkg:composer/memio/spec-gen
Requires
- php: ^7.2
 - gnugat/redaktilo: ^2.0
 - memio/linter: ^2.0
 - memio/memio: ^2.0
 - memio/model: ^2.0.1
 - memio/pretty-printer: ^2.0
 - memio/twig-template-engine: ^2.0.1
 - memio/validator: ^2.0
 - phpspec/phpspec: ^6.1
 - symfony/event-dispatcher: ^5.0
 
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
 - phpunit/phpunit: ^8.4
 
README
This extension for phpspec provides a powerful code generator:
- method generation:
- it inserts method at the end of the class
 - it typehints arguments (uses interface when possible)
 - it names object arguments after their type (strips 
Interfacesuffix from names) - it names scalar arguments after a generic name (
argument) - it adds number on names that could collide (e.g. 
$argument1, $argument2) 
 - constructor generation, same as method except:
- it inserts constructor at the begining of the class
 - it inserts properties with initialization for each constructor arguments
 
 
Note: Currently it is not possible to provide custom templates to SpecGen (it is not compatible with phpspec templates).
Installation
First install it using Composer:
$ composer require --dev memio/spec-gen:^0.10
Then enable it in phpspec.yml:
extensions: Memio\SpecGen\MemioSpecGenExtension: ~
Version guide:
- 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
 
Full example
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.
Want to know more?
You can see the current and past versions using one of the following:
- the 
git tagcommand - the releases page on Github
 - the file listing the changes between versions
 
And finally some meta documentation:
Roadmap
- constructor property promotion
 - return type hints
 - method body (mirror of test method body)
 - better scalar argument naming (based on names used in test)