67 lines
2.2 KiB
PHP
67 lines
2.2 KiB
PHP
<?php
|
|
namespace Codeception\Subscriber;
|
|
|
|
use Codeception\Configuration;
|
|
use Codeception\Event\SuiteEvent;
|
|
use Codeception\Events;
|
|
use Codeception\Lib\Generator\Actions;
|
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
|
|
|
class AutoRebuild implements EventSubscriberInterface
|
|
{
|
|
use Shared\StaticEvents;
|
|
|
|
public static $events = [
|
|
Events::SUITE_INIT => 'updateActor'
|
|
];
|
|
|
|
public function updateActor(SuiteEvent $e)
|
|
{
|
|
$settings = $e->getSettings();
|
|
if (!$settings['actor']) {
|
|
codecept_debug('actor is empty');
|
|
return; // no actor
|
|
}
|
|
|
|
$modules = $e->getSuite()->getModules();
|
|
|
|
$actorActionsFile = Configuration::supportDir() . '_generated' . DIRECTORY_SEPARATOR
|
|
. $settings['actor'] . 'Actions.php';
|
|
|
|
if (!file_exists($actorActionsFile)) {
|
|
codecept_debug("Generating {$settings['actor']}Actions...");
|
|
$this->generateActorActions($actorActionsFile, $settings);
|
|
return;
|
|
}
|
|
|
|
// load actor class to see hash
|
|
$handle = @fopen($actorActionsFile, "r");
|
|
if ($handle and is_writable($actorActionsFile)) {
|
|
$line = @fgets($handle);
|
|
if (preg_match('~\[STAMP\] ([a-f0-9]*)~', $line, $matches)) {
|
|
$hash = $matches[1];
|
|
$currentHash = Actions::genHash($modules, $settings);
|
|
|
|
// regenerate actor class when hashes do not match
|
|
if ($hash != $currentHash) {
|
|
codecept_debug("Rebuilding {$settings['actor']}...");
|
|
@fclose($handle);
|
|
$this->generateActorActions($actorActionsFile, $settings);
|
|
return;
|
|
}
|
|
}
|
|
@fclose($handle);
|
|
}
|
|
}
|
|
|
|
protected function generateActorActions($actorActionsFile, $settings)
|
|
{
|
|
if (!file_exists(Configuration::supportDir() . '_generated')) {
|
|
@mkdir(Configuration::supportDir() . '_generated');
|
|
}
|
|
$actionsGenerator = new Actions($settings);
|
|
$generated = $actionsGenerator->produce();
|
|
@file_put_contents($actorActionsFile, $generated);
|
|
}
|
|
}
|