1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-16 15:28:48 +02:00

Improve bin/lipsum UX

Summary: Ref T9156. This makes the UX a little more modern/standard/safe.

Test Plan:
```
epriestley@orbital ~/dev/phabricator $ ./bin/lipsum generate
Choose which type or types of test data you want to generate, or select "all".

      - Differential Revisions
      - Files
      - Maniphest Tasks
      - Pastes
      - Pholio Mocks
      - Projects
      - User Accounts
```

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T9156

Differential Revision: https://secure.phabricator.com/D14873
This commit is contained in:
epriestley 2015-12-24 04:49:25 -08:00
parent 1c572d1da5
commit ba37149bf9
10 changed files with 141 additions and 67 deletions

View file

@ -5,10 +5,10 @@ $root = dirname(dirname(dirname(__FILE__)));
require_once $root.'/scripts/__init_script__.php';
$args = new PhutilArgumentParser($argv);
$args->setTagline(pht('manage lipsum'));
$args->setTagline(pht('synthetic data generator'));
$args->setSynopsis(<<<EOSYNOPSIS
**lipsum** __command__ [__options__]
Manage Phabricator Test Data Generator.
Generate synthetic test data to make development easier.
EOSYNOPSIS
);

View file

@ -3,7 +3,11 @@
final class PhabricatorDifferentialRevisionTestDataGenerator
extends PhabricatorTestDataGenerator {
public function generate() {
public function getGeneratorName() {
return pht('Differential Revisions');
}
public function generateObject() {
$author = $this->loadPhabrictorUser();
$revision = DifferentialRevision::initializeNewRevision($author);

View file

@ -3,7 +3,11 @@
final class PhabricatorFileTestDataGenerator
extends PhabricatorTestDataGenerator {
public function generate() {
public function getGeneratorName() {
return pht('Files');
}
public function generateObject() {
$author_phid = $this->loadPhabrictorUserPHID();
$dimension = 1 << rand(5, 12);
$image = id(new PhabricatorLipsumMondrianArtist())

View file

@ -2,9 +2,8 @@
abstract class PhabricatorTestDataGenerator extends Phobject {
public function generate() {
return;
}
abstract public function getGeneratorName();
abstract public function generateObject();
public function loadOneRandom($classname) {
try {

View file

@ -7,7 +7,7 @@ final class PhabricatorLipsumGenerateWorkflow
$this
->setName('generate')
->setExamples('**generate**')
->setSynopsis(pht('Generate some lipsum.'))
->setSynopsis(pht('Generate synthetic test objects.'))
->setArguments(
array(
array(
@ -18,77 +18,124 @@ final class PhabricatorLipsumGenerateWorkflow
}
public function execute(PhutilArgumentParser $args) {
$console = PhutilConsole::getConsole();
$config_key = 'phabricator.developer-mode';
if (!PhabricatorEnv::getEnvConfig($config_key)) {
throw new PhutilArgumentUsageException(
pht(
'lipsum is a development and testing tool and may only be run '.
'on installs in developer mode. Enable "%s" in your configuration '.
'to enable lipsum.',
$config_key));
}
$supported_types = id(new PhutilClassMapQuery())
$all_generators = id(new PhutilClassMapQuery())
->setAncestorClass('PhabricatorTestDataGenerator')
->execute();
$console->writeOut(
"%s:\n\t%s\n",
pht('These are the types of data you can generate'),
implode("\n\t", array_keys($supported_types)));
$argv = $args->getArg('args');
$all = 'all';
$prompt = pht('Are you sure you want to generate lots of test data?');
if (!$argv) {
$names = mpull($all_generators, 'getGeneratorName');
sort($names);
$list = id(new PhutilConsoleList())
->setWrap(false)
->addItems($names);
id(new PhutilConsoleBlock())
->addParagraph(
pht(
'Choose which type or types of test data you want to generate, '.
'or select "%s".',
$all))
->addList($list)
->draw();
return 0;
}
$generators = array();
foreach ($argv as $arg_original) {
$arg = phutil_utf8_strtolower($arg_original);
$match = false;
foreach ($all_generators as $generator) {
$name = phutil_utf8_strtolower($generator->getGeneratorName());
if ($arg == $all) {
$generators[] = $generator;
$match = true;
break;
}
if (strpos($name, $arg) !== false) {
$generators[] = $generator;
$match = true;
break;
}
}
if (!$match) {
throw new PhutilArgumentUsageException(
pht(
'Argument "%s" does not match the name of any generators.',
$arg_original));
}
}
echo tsprintf(
"**<bg:blue> %s </bg>** %s\n",
pht('GENERATORS'),
pht(
'Selected generators: %s.',
implode(', ', mpull($generators, 'getGeneratorName'))));
echo tsprintf(
"**<bg:yellow> %s </bg>** %s\n",
pht('WARNING'),
pht(
'This command generates synthetic test data, including user '.
'accounts. It is intended for use in development environments '.
'so you can test features more easily. There is no easy way to '.
'delete this data or undo the effects of this command. If you run '.
'it in a production environment, it will pollute your data with '.
'large amounts of meaningless garbage that you can not get rid of.'));
$prompt = pht('Are you sure you want to generate piles of garbage?');
if (!phutil_console_confirm($prompt, true)) {
return;
}
$argv = $args->getArg('args');
if (count($argv) == 0 || (count($argv) == 1 && $argv[0] == 'all')) {
$this->infinitelyGenerate($supported_types);
} else {
$new_supported_types = array();
for ($i = 0; $i < count($argv); $i++) {
$arg = $argv[$i];
if (array_key_exists($arg, $supported_types)) {
$new_supported_types[$arg] = $supported_types[$arg];
} else {
$console->writeErr(
"%s\n",
pht(
'The type %s is not supported by the lipsum generator.',
$arg));
}
}
$this->infinitelyGenerate($new_supported_types);
}
echo tsprintf(
"**<bg:green> %s </bg>** %s\n",
pht('LIPSUM'),
pht(
'Generating synthetic test objects forever. '.
'Use ^C to stop when satisfied.'));
$console->writeOut(
"%s\n%s:\n%s\n",
pht('None of the input types were supported.'),
pht('The supported types are'),
implode("\n", array_keys($supported_types)));
$this->generate($generators);
}
protected function infinitelyGenerate(array $supported_types) {
$console = PhutilConsole::getConsole();
if (count($supported_types) == 0) {
return;
}
$console->writeOut(
"%s: %s\n",
pht('GENERATING'),
implode(', ', array_keys($supported_types)));
protected function generate(array $generators) {
$viewer = $this->getViewer();
while (true) {
$type = $supported_types[array_rand($supported_types)];
$admin = $this->getViewer();
$generator = $generators[array_rand($generators)];
$taskgen = newv($type, array());
$object = $taskgen->generate();
$handle = id(new PhabricatorHandleQuery())
->setViewer($admin)
->withPHIDs(array($object->getPHID()))
->executeOne();
$object = $generator->generateObject();
$object_phid = $object->getPHID();
$console->writeOut(
"%s: %s\n",
pht('Generated %s', $handle->getTypeName()),
$handle->getFullName());
$handles = $viewer->loadHandles(array($object_phid));
usleep(200000);
echo tsprintf(
"%s\n",
pht(
'Generated "%s": %s',
$handles[$object_phid]->getTypeName(),
$handles[$object_phid]->getFullName()));
sleep(1);
}
}

View file

@ -3,7 +3,11 @@
final class PhabricatorManiphestTaskTestDataGenerator
extends PhabricatorTestDataGenerator {
public function generate() {
public function getGeneratorName() {
return pht('Maniphest Tasks');
}
public function generateObject() {
$author_phid = $this->loadPhabrictorUserPHID();
$author = id(new PhabricatorUser())
->loadOneWhere('phid = %s', $author_phid);

View file

@ -3,13 +3,17 @@
final class PhabricatorPasteTestDataGenerator
extends PhabricatorTestDataGenerator {
public function getGeneratorName() {
return pht('Pastes');
}
// Better Support for this in the future
public $supportedLanguages = array(
'Java' => 'java',
'PHP' => 'php',
);
public function generate() {
public function generateObject() {
$author = $this->loadPhabrictorUser();
$authorphid = $author->getPHID();
$language = $this->generateLanguage();

View file

@ -3,7 +3,11 @@
final class PhabricatorPeopleTestDataGenerator
extends PhabricatorTestDataGenerator {
public function generate() {
public function getGeneratorName() {
return pht('User Accounts');
}
public function generateObject() {
while (true) {
try {

View file

@ -3,7 +3,11 @@
final class PhabricatorPholioMockTestDataGenerator
extends PhabricatorTestDataGenerator {
public function generate() {
public function getGeneratorName() {
return pht('Pholio Mocks');
}
public function generateObject() {
$author_phid = $this->loadPhabrictorUserPHID();
$author = id(new PhabricatorUser())
->loadOneWhere('phid = %s', $author_phid);

View file

@ -5,7 +5,11 @@ final class PhabricatorProjectTestDataGenerator
private $xactions = array();
public function generate() {
public function getGeneratorName() {
return pht('Projects');
}
public function generateObject() {
$title = $this->generateTitle();
$author = $this->loadPhabrictorUser();
$author_phid = $author->getPHID();