Skip to content

Commit

Permalink
API Update API to reflect changes to CLI interaction
Browse files Browse the repository at this point in the history
  • Loading branch information
GuySartorelli committed Sep 3, 2024
1 parent d9c5f8c commit 3db29ed
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 101 deletions.
6 changes: 3 additions & 3 deletions _config/extensions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ SilverStripe\FrameworkTest\Fields\NestedGridField\NonRelationalData:
extensions:
- SilverStripe\FrameworkTest\Extension\TestDataObjectExtension

SilverStripe\ORM\DatabaseAdmin:
SilverStripe\HybridExecution\Command\DbBuild:
extensions:
- SilverStripe\FrameworkTest\GridFieldArbitraryData\DatabaseBuildExtension
- SilverStripe\FrameworkTest\GridFieldArbitraryData\DbBuildExtension

---
Only:
moduleexists: 'silverstripe/testsession'
---
SilverStripe\TestSession\TestSessionEnvironment:
extensions:
- SilverStripe\FrameworkTest\GridFieldArbitraryData\DatabaseBuildExtension
- SilverStripe\FrameworkTest\GridFieldArbitraryData\DbBuildExtension

---
Only:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

use SilverStripe\Control\Director;
use SilverStripe\Core\Extension;
use SilverStripe\ORM\DatabaseAdmin;
use SilverStripe\HybridExecution\Command\DbBuild;
use SilverStripe\HybridExecution\HybridOutput;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\DB;
use SilverStripe\ORM\FieldType\DBDatetime;
Expand All @@ -13,7 +14,7 @@
/**
* Builds the table and adds default records for the ArbitraryDataModel.
*/
class DatabaseBuildExtension extends Extension
class DbBuildExtension extends Extension
{
/**
* This extension hook is on TestSessionEnvironment, which is used by behat but not by phpunit.
Expand All @@ -22,78 +23,52 @@ class DatabaseBuildExtension extends Extension
*/
protected function onAfterStartTestSession()
{
$this->buildTable(true);
$output = HybridOutput::create(Director::is_cli() ? HybridOutput::FORMAT_ANSI : HybridOutput::FORMAT_HTML);
$this->buildTable($output);
$this->populateData();
}

/**
* This extension hook is on DatabaseAdmin, after dev/build has finished building the database.
* This extension hook is on DbBuild, after dev/build has finished building the database.
*/
protected function onAfterBuild(bool $quiet, bool $populate, bool $testMode): void
protected function onAfterBuild(HybridOutput $output, bool $populate, bool $testMode): void
{
if ($testMode) {
return;
}

if (!$quiet) {
if (Director::is_cli()) {
echo "\nCREATING TABLE FOR FRAMEWORKTEST ARBITRARY DATA\n\n";
} else {
echo "\n<p><b>Creating table for frameworktest arbitrary data</b></p><ul>\n\n";
}
}

$this->buildTable($quiet);

if (!$quiet && !Director::is_cli()) {
echo '</ul>';
}

$output->writeln('<options=bold>Creating table for frameworktest arbitrary data</>');
$output->startList();
$this->buildTable($output);
$output->stopList();
if ($populate) {
if (!$quiet) {
if (Director::is_cli()) {
echo "\nCREATING DATABASE RECORDS FOR FRAMEWORKTEST ARBITRARY DATA\n\n";
} else {
echo "\n<p><b>Creating database records arbitrary data</b></p><ul>\n\n";
}
}

$output->writeln('<options=bold>Creating database records arbitrary data</>');
$output->startList();
$this->populateData();

if (!$quiet && !Director::is_cli()) {
echo '</ul>';
}
}

if (!$quiet) {
echo (Director::is_cli()) ? "\n Frameworktest database build completed!\n\n" : '<p>Frameworktest database build completed!</p>';
$output->stopList();
}
$output->writeln(['<options=bold>Frameworktest database build completed!</>', '']);
}

private function buildTable(bool $quiet): void
private function buildTable(HybridOutput $output): void
{
$tableName = ArbitraryDataModel::TABLE_NAME;

// Log data
if (!$quiet) {
$showRecordCounts = DatabaseAdmin::config()->get('show_record_counts');
if ($showRecordCounts && DB::get_schema()->hasTable($tableName)) {
try {
$count = SQLSelect::create()->setFrom($tableName)->count();
$countSuffix = " ($count records)";
} catch (\Exception $e) {
$countSuffix = ' (error getting record count)';
}
} else {
$countSuffix = "";
}

if (Director::is_cli()) {
echo " * $tableName$countSuffix\n";
} else {
echo "<li>$tableName$countSuffix</li>\n";
$showRecordCounts = DbBuild::config()->get('show_record_counts');
if ($showRecordCounts && DB::get_schema()->hasTable($tableName)) {
try {
$count = SQLSelect::create()->setFrom($tableName)->count();
$countSuffix = " ($count records)";
} catch (\Exception $e) {
$countSuffix = ' (error getting record count)';
}
} else {
$countSuffix = "";
}
// We're adding one list item, but we need to do it this way for consistency
// with the rest of dev/build.
$output->writeListItem($tableName . $countSuffix);

// Get field schema
$fields = [
Expand Down
67 changes: 43 additions & 24 deletions code/tasks/FTFileMakerTask.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
use SilverStripe\Security\Security;
use SilverStripe\Core\Path;
use SilverStripe\Core\Manifest\ModuleResourceLoader;
use SilverStripe\HybridExecution\HybridOutput;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;

/**
* Creates sample folder and file structure, useful to test performance,
Expand All @@ -24,10 +28,6 @@
* recursively delete any generated ones through the following bash command in `assets/`:
* `find . -name '*Resampled*' -print0 | xargs -0 rm`
*
* Parameters:
* - reset=1: Optionally truncate ALL files and folders in the database, plus delete
* the entire `assets/` directory.
*
*
* Configuration
*
Expand Down Expand Up @@ -180,8 +180,6 @@ class FTFileMakerTask extends BuildTask
'video.m4v' => 'SilverStripe\Assets\File',
];

protected $lineBreak = "\n<br>";

/** @var Member */
protected $anonymousMember = null;

Expand All @@ -197,7 +195,7 @@ class FTFileMakerTask extends BuildTask
*/
protected $folderCounts = [];

public function run($request)
protected function doRun(InputInterface $input, HybridOutput $output): int
{
set_time_limit(0);

Expand All @@ -213,15 +211,11 @@ public function run($request)
}
Security::setCurrentUser($this->anonymousMember);

if (php_sapi_name() == "cli") {
$this->lineBreak = "\n";
}

if ($request->getVar('reset')) {
$this->reset();
if ($input->getOption('reset')) {
$this->reset($output);
}

$fileCounts = $request->getVar('fileCounts');
$fileCounts = $input->getOption('fileCounts');
if ($fileCounts) {
$counts = explode(',', $fileCounts ?? '');
$this->fileCounts = array_map(function ($int) {
Expand All @@ -231,7 +225,7 @@ public function run($request)
$this->fileCounts = FTFileMakerTask::config()->get('fileCountByDepth');
}

$folderCounts = $request->getVar('folderCounts');
$folderCounts = $input->getOption('folderCounts');
if ($folderCounts) {
$counts = explode(',', $folderCounts ?? '');
$this->folderCounts = array_map(function ($int) {
Expand All @@ -241,26 +235,27 @@ public function run($request)
$this->folderCounts = FTFileMakerTask::config()->get('folderCountByDepth');
}

echo "Downloading fixtures" . $this->lineBreak;
$fixtureFilePaths = $this->downloadFixtureFiles();
$output->writeln('Downloading fixtures');
$fixtureFilePaths = $this->downloadFixtureFiles($output);

if (!FTFileMakerTask::config()->get('documentsOnly')) {
echo "Generate thumbnails" . $this->lineBreak;
$output->writeln('Generate thumbnails');
$this->generateThumbnails($fixtureFilePaths);
}

echo "Generate files" . $this->lineBreak;
$output->writeln('Generate files');
$this->generateFiles($fixtureFilePaths);

if (!FTFileMakerTask::config()->get('doPutProtectedFilesInPublicStore')) {
echo "Incorrectly putting protected files into public asset store on purpose" . $this->lineBreak;
$output->writeln('Incorrectly putting protected files into public asset store on purpose');
$this->putProtectedFilesInPublicAssetStore();
}
return Command::SUCCESS;
}

protected function reset()
protected function reset(HybridOutput $output)
{
echo "Resetting assets" . $this->lineBreak;
$output->writeln('Resetting assets');

DB::query('TRUNCATE "File"');
DB::query('TRUNCATE "File_Live"');
Expand All @@ -271,7 +266,7 @@ protected function reset()
}
}

protected function downloadFixtureFiles()
protected function downloadFixtureFiles(HybridOutput $output)
{
$client = new Client(['base_uri' => $this->fixtureFileBaseUrl]);

Expand All @@ -293,7 +288,7 @@ protected function downloadFixtureFiles()
$promises[$filename] = $client->getAsync($filename, [
'sink' => $path
]);
echo "Downloading $url" . $this->lineBreak;
$output->writeln("Downloading $url");
}
}

Expand Down Expand Up @@ -497,4 +492,28 @@ protected function watermarkImage(string $stampPath, string $targetPath): ?strin
return $targetPath;
}

public function getOptions(): array
{
return [
new InputOption(
'reset',
null,
InputOption::VALUE_NONE,
'Optionally truncate ALL files and folders in the database,'
. ' plus delete the entire `assets/` directory',
),
new InputOption(
'fileCounts',
null,
InputOption::VALUE_REQUIRED,
'Comma separated string'
),
new InputOption(
'folderCounts',
null,
InputOption::VALUE_REQUIRED,
'Comma separated string'
),
];
}
}
43 changes: 32 additions & 11 deletions code/tasks/FTPageMakerTask.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
use SilverStripe\ElementalFileBlock\Block\FileBlock;
use SilverStripe\CMS\Model\SiteTree;
use DNADesign\Elemental\Extensions\ElementalPageExtension;
use DNADesign\Elemental\Models\BaseElement;
use SilverStripe\HybridExecution\HybridOutput;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;

/**
* Creates sample page structure, useful to test tree performance,
Expand Down Expand Up @@ -48,27 +51,28 @@ class FTPageMakerTask extends BuildTask
'SilverStripe\ElementalFileBlock\Block\FileBlock' => [FTPageMakerTask::class, 'generateFileBlock'],
];

public function run($request)
protected function doRun(InputInterface $input, HybridOutput $output): int
{
// Optionally add blocks
$withBlocks = (bool)$request->getVar('withBlocks');
$withBlocks = (bool)$input->getOption('withBlocks');
if ($withBlocks && !class_exists('DNADesign\Elemental\Models\BaseElement')) {
throw new \LogicException('withBlocks requested, but BaseElement class not found');
}

// Allow pageCountByDepth to be passed as comma-separated value, e.g. pageCounts=5,100,1,1
$pageCounts = $request->getVar('pageCounts');
$pageCounts = $input->getOption('pageCounts');
if ($pageCounts) {
$counts = explode(',', $pageCounts ?? '');
$this->pageCountByDepth = array_map(function ($int) {
return (int) trim($int ?? '');
}, $counts ?? []);
}

$this->generatePages(0, "", 0, $withBlocks);
$this->generatePages($output, 0, "", 0, $withBlocks);
return Command::SUCCESS;
}

protected function generatePages($depth = 0, $prefix = "", $parentID = 0, $withBlocks = false)
protected function generatePages(HybridOutput $output, $depth = 0, $prefix = "", $parentID = 0, $withBlocks = false)
{
$maxDepth = count($this->pageCountByDepth ?? []);
$pageCount = $this->pageCountByDepth[$depth];
Expand All @@ -84,23 +88,23 @@ protected function generatePages($depth = 0, $prefix = "", $parentID = 0, $withB
$page->write();
$page->copyVersionToStage('Stage', 'Live');

echo "Created '$page->Title' ($page->ClassName)\n";
$output->writeln("Created '$page->Title' ($page->ClassName)");

if ($withBlocks) {
$this->generateBlocksForPage($page);
$this->generateBlocksForPage($output, $page);
}

$pageID = $page->ID;

unset($page);

if ($depth < $maxDepth-1) {
$this->generatePages($depth+1, $fullPrefix, $pageID, $withBlocks);
$this->generatePages($output, $depth+1, $fullPrefix, $pageID, $withBlocks);
}
}
}

protected function generateBlocksForPage(Page $page)
protected function generateBlocksForPage(HybridOutput $output, Page $page)
{
$classes = array_filter($this->config()->get('block_generators') ?? [], function ($callable, $class) {
return class_exists($class ?? '');
Expand All @@ -121,7 +125,7 @@ protected function generateBlocksForPage(Page $page)
$block->publishRecursive();
}

echo sprintf(" Added '%s' block #%d to page #%d\n", $class, $block->ID, $page->ID);
$output->writeln(sprintf(" Added '%s' block #%d to page #%d", $class, $block->ID, $page->ID));
}
}

Expand Down Expand Up @@ -193,4 +197,21 @@ public static function generateBannerBlock(?SiteTree $page = null): BannerBlock
return $block;
}

public function getOptions(): array
{
return [
new InputOption(
'withBlocks',
null,
InputOption::VALUE_NONE,
'Include elemental blocks on the page',
),
new InputOption(
'pageCounts',
null,
InputOption::VALUE_REQUIRED,
'Comma separated string'
),
];
}
}
Loading

0 comments on commit 3db29ed

Please sign in to comment.