Page MenuHomePhorge

No OneTemporary

diff --git a/src/applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php b/src/applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php
index 70f79309fd..2fe7c141f9 100644
--- a/src/applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php
+++ b/src/applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php
@@ -1,105 +1,107 @@
<?php
final class PhabricatorDifferentialRevisionTestDataGenerator
extends PhabricatorTestDataGenerator {
+ const GENERATORKEY = 'revisions';
+
public function getGeneratorName() {
return pht('Differential Revisions');
}
public function generateObject() {
$author = $this->loadPhabricatorUser();
$revision = DifferentialRevision::initializeNewRevision($author);
$revision->attachReviewerStatus(array());
$revision->attachActiveDiff(null);
// This could be a bit richer and more formal than it is.
$revision->setTitle($this->generateTitle());
$revision->setSummary($this->generateDescription());
$revision->setTestPlan($this->generateDescription());
$diff = $this->generateDiff($author);
$xactions = array();
$xactions[] = id(new DifferentialTransaction())
->setTransactionType(DifferentialTransaction::TYPE_UPDATE)
->setNewValue($diff->getPHID());
id(new DifferentialTransactionEditor())
->setActor($author)
->setContentSource($this->getLipsumContentSource())
->applyTransactions($revision, $xactions);
return $revision;
}
public function getCCPHIDs() {
$ccs = array();
for ($i = 0; $i < rand(1, 4);$i++) {
$ccs[] = $this->loadPhabricatorUserPHID();
}
return $ccs;
}
public function generateDiff($author) {
$paste_generator = new PhabricatorPasteTestDataGenerator();
$languages = $paste_generator->supportedLanguages;
$lang = array_rand($languages);
$code = $paste_generator->generateContent($lang);
$altcode = $paste_generator->generateContent($lang);
$newcode = $this->randomlyModify($code, $altcode);
$diff = id(new PhabricatorDifferenceEngine())
->generateRawDiffFromFileContent($code, $newcode);
$call = new ConduitCall(
'differential.createrawdiff',
array(
'diff' => $diff,
));
$call->setUser($author);
$result = $call->execute();
$thediff = id(new DifferentialDiff())->load(
$result['id']);
$thediff->setDescription($this->generateTitle())->save();
return $thediff;
}
public function generateDescription() {
return id(new PhutilLipsumContextFreeGrammar())
->generate(10, 20);
}
public function generateTitle() {
return id(new PhutilLipsumContextFreeGrammar())
->generate();
}
public function randomlyModify($code, $altcode) {
$codearr = explode("\n", $code);
$altcodearr = explode("\n", $altcode);
$no_lines_to_delete = rand(1,
min(count($codearr) - 2, 5));
$randomlines = array_rand($codearr,
count($codearr) - $no_lines_to_delete);
$newcode = array();
foreach ($randomlines as $lineno) {
$newcode[] = $codearr[$lineno];
}
$newlines_count = rand(2,
min(count($codearr) - 2, count($altcodearr) - 2, 5));
$randomlines_orig = array_rand($codearr, $newlines_count);
$randomlines_new = array_rand($altcodearr, $newlines_count);
$newcode2 = array();
$c = 0;
for ($i = 0; $i < count($newcode);$i++) {
$newcode2[] = $newcode[$i];
if (in_array($i, $randomlines_orig)) {
$newcode2[] = $altcodearr[$randomlines_new[$c++]];
}
}
return implode($newcode2, "\n");
}
}
diff --git a/src/applications/files/lipsum/PhabricatorFileTestDataGenerator.php b/src/applications/files/lipsum/PhabricatorFileTestDataGenerator.php
index c1daa0dea4..11e0baa6ec 100644
--- a/src/applications/files/lipsum/PhabricatorFileTestDataGenerator.php
+++ b/src/applications/files/lipsum/PhabricatorFileTestDataGenerator.php
@@ -1,24 +1,26 @@
<?php
final class PhabricatorFileTestDataGenerator
extends PhabricatorTestDataGenerator {
+ const GENERATORKEY = 'files';
+
public function getGeneratorName() {
return pht('Files');
}
public function generateObject() {
$author_phid = $this->loadPhabricatorUserPHID();
$dimension = 1 << rand(5, 12);
$image = id(new PhabricatorLipsumMondrianArtist())
->generate($dimension, $dimension);
$file = PhabricatorFile::newFromFileData(
$image,
array(
'name' => 'rand-'.rand(1000, 9999),
));
$file->setAuthorPHID($author_phid);
$file->setMimeType('image/jpeg');
return $file->save();
}
}
diff --git a/src/applications/lipsum/generator/PhabricatorTestDataGenerator.php b/src/applications/lipsum/generator/PhabricatorTestDataGenerator.php
index fe784dcb10..731bb0ccac 100644
--- a/src/applications/lipsum/generator/PhabricatorTestDataGenerator.php
+++ b/src/applications/lipsum/generator/PhabricatorTestDataGenerator.php
@@ -1,115 +1,119 @@
<?php
abstract class PhabricatorTestDataGenerator extends Phobject {
private $viewer;
abstract public function getGeneratorName();
abstract public function generateObject();
final public function setViewer(PhabricatorUser $viewer) {
$this->viewer = $viewer;
return $this;
}
final public function getViewer() {
return $this->viewer;
}
+ final public function getGeneratorKey() {
+ return $this->getPhobjectClassConstant('GENERATORKEY', 64);
+ }
+
protected function loadRandomPHID($table) {
$conn_r = $table->establishConnection('r');
$row = queryfx_one(
$conn_r,
'SELECT phid FROM %T ORDER BY RAND() LIMIT 1',
$table->getTableName());
if (!$row) {
return null;
}
return $row['phid'];
}
protected function loadRandomUser() {
$viewer = $this->getViewer();
$user_phid = $this->loadRandomPHID(new PhabricatorUser());
$user = null;
if ($user_phid) {
$user = id(new PhabricatorPeopleQuery())
->setViewer($viewer)
->withPHIDs(array($user_phid))
->executeOne();
}
if (!$user) {
throw new Exception(
pht(
'Failed to load a random user. You may need to generate more '.
'test users first.'));
}
return $user;
}
protected function getLipsumContentSource() {
return PhabricatorContentSource::newForSource(
PhabricatorLipsumContentSource::SOURCECONST);
}
/**
* Roll `n` dice with `d` sides each, then add `bonus` and return the sum.
*/
protected function roll($n, $d, $bonus = 0) {
$sum = 0;
for ($ii = 0; $ii < $n; $ii++) {
$sum += mt_rand(1, $d);
}
$sum += $bonus;
return $sum;
}
protected function newEmptyTransaction() {
throw new PhutilMethodNotImplementedException();
}
protected function newTransaction($type, $value, $metadata = array()) {
$xaction = $this->newEmptyTransaction()
->setTransactionType($type)
->setNewValue($value);
foreach ($metadata as $key => $value) {
$xaction->setMetadataValue($key, $value);
}
return $xaction;
}
public function loadOneRandom($classname) {
try {
return newv($classname, array())
->loadOneWhere('1 = 1 ORDER BY RAND() LIMIT 1');
} catch (PhutilMissingSymbolException $ex) {
throw new PhutilMissingSymbolException(
$classname,
pht('class'),
pht(
'Unable to load symbol %s: this class does not exist.',
$classname));
}
}
public function loadPhabricatorUserPHID() {
return $this->loadOneRandom('PhabricatorUser')->getPHID();
}
public function loadPhabricatorUser() {
return $this->loadOneRandom('PhabricatorUser');
}
}
diff --git a/src/applications/lipsum/management/PhabricatorLipsumGenerateWorkflow.php b/src/applications/lipsum/management/PhabricatorLipsumGenerateWorkflow.php
index 866e8b1cb0..46ea9b6bae 100644
--- a/src/applications/lipsum/management/PhabricatorLipsumGenerateWorkflow.php
+++ b/src/applications/lipsum/management/PhabricatorLipsumGenerateWorkflow.php
@@ -1,162 +1,196 @@
<?php
final class PhabricatorLipsumGenerateWorkflow
extends PhabricatorLipsumManagementWorkflow {
protected function didConstruct() {
$this
->setName('generate')
->setExamples('**generate**')
->setSynopsis(pht('Generate synthetic test objects.'))
->setArguments(
array(
array(
'name' => 'args',
'wildcard' => true,
),
));
}
public function execute(PhutilArgumentParser $args) {
$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));
}
$all_generators = id(new PhutilClassMapQuery())
->setAncestorClass('PhabricatorTestDataGenerator')
+ ->setUniqueMethod('getGeneratorKey')
->execute();
$argv = $args->getArg('args');
$all = 'all';
+ if (isset($all_generators[$all])) {
+ throw new Exception(
+ pht(
+ 'A lipsum generator is registered with key "%s". This key is '.
+ 'reserved.',
+ $all));
+ }
+
if (!$argv) {
- $names = mpull($all_generators, 'getGeneratorName');
- sort($names);
+ ksort($all_generators);
+
+ $names = array();
+ foreach ($all_generators as $generator) {
+ $names[] = tsprintf(
+ '%s (%s)',
+ $generator->getGeneratorKey(),
+ $generator->getGeneratorName());
+ }
$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') {
+ $matches = $all_generators;
+ } else {
+ $matches = array();
+ foreach ($all_generators as $generator) {
+ $name = phutil_utf8_strtolower($generator->getGeneratorKey());
+
+ // If there's an exact match, select just that generator.
+ if ($arg == $name) {
+ $matches = array($generator);
+ break;
+ }
+
+ // If there's a partial match, match that generator but continue.
+ if (strpos($name, $arg) !== false) {
+ $matches[] = $generator;
+ }
+ }
- if ($arg == $all) {
- $generators[] = $generator;
- $match = true;
- break;
+ if (!$matches) {
+ throw new PhutilArgumentUsageException(
+ pht(
+ 'Argument "%s" does not match the name of any generators.',
+ $arg_original));
}
- if (strpos($name, $arg) !== false) {
- $generators[] = $generator;
- $match = true;
- break;
+ if (count($matches) > 1) {
+ throw new PhutilArgumentUsageException(
+ pht(
+ 'Argument "%s" is ambiguous, and matches multiple '.
+ 'generators: %s.',
+ $arg_original,
+ implode(', ', mpull($matches, 'getGeneratorName'))));
}
}
- if (!$match) {
- throw new PhutilArgumentUsageException(
- pht(
- 'Argument "%s" does not match the name of any generators.',
- $arg_original));
+ foreach ($matches as $match) {
+ $generators[] = $match;
}
}
+ $generators = mpull($generators, null, 'getGeneratorKey');
+
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;
}
echo tsprintf(
"**<bg:green> %s </bg>** %s\n",
pht('LIPSUM'),
pht(
'Generating synthetic test objects forever. '.
'Use ^C to stop when satisfied.'));
$this->generate($generators);
}
protected function generate(array $generators) {
$viewer = $this->getViewer();
foreach ($generators as $generator) {
$generator->setViewer($this->getViewer());
}
while (true) {
$generator = $generators[array_rand($generators)];
try {
$object = $generator->generateObject();
} catch (Exception $ex) {
echo tsprintf(
"**<bg:yellow> %s </bg>** %s\n",
pht('OOPS'),
pht(
'Generator ("%s") was unable to generate an object.',
$generator->getGeneratorName()));
echo tsprintf(
"%B\n",
$ex->getMessage());
continue;
}
$object_phid = $object->getPHID();
$handles = $viewer->loadHandles(array($object_phid));
echo tsprintf(
"%s\n",
pht(
'Generated "%s": %s',
$handles[$object_phid]->getTypeName(),
$handles[$object_phid]->getFullName()));
sleep(1);
}
}
}
diff --git a/src/applications/maniphest/lipsum/PhabricatorManiphestTaskTestDataGenerator.php b/src/applications/maniphest/lipsum/PhabricatorManiphestTaskTestDataGenerator.php
index 50a1df77c0..404a36af8f 100644
--- a/src/applications/maniphest/lipsum/PhabricatorManiphestTaskTestDataGenerator.php
+++ b/src/applications/maniphest/lipsum/PhabricatorManiphestTaskTestDataGenerator.php
@@ -1,120 +1,122 @@
<?php
final class PhabricatorManiphestTaskTestDataGenerator
extends PhabricatorTestDataGenerator {
+ const GENERATORKEY = 'tasks';
+
public function getGeneratorName() {
return pht('Maniphest Tasks');
}
public function generateObject() {
$author_phid = $this->loadPhabricatorUserPHID();
$author = id(new PhabricatorUser())
->loadOneWhere('phid = %s', $author_phid);
$task = ManiphestTask::initializeNewTask($author)
->setSubPriority($this->generateTaskSubPriority())
->setTitle($this->generateTitle());
$content_source = $this->getLipsumContentSource();
$template = new ManiphestTransaction();
// Accumulate Transactions
$changes = array();
$changes[ManiphestTransaction::TYPE_TITLE] =
$this->generateTitle();
$changes[ManiphestTransaction::TYPE_DESCRIPTION] =
$this->generateDescription();
$changes[ManiphestTransaction::TYPE_OWNER] =
$this->loadOwnerPHID();
$changes[ManiphestTransaction::TYPE_STATUS] =
$this->generateTaskStatus();
$changes[ManiphestTransaction::TYPE_PRIORITY] =
$this->generateTaskPriority();
$changes[PhabricatorTransactions::TYPE_SUBSCRIBERS] =
array('=' => $this->getCCPHIDs());
$transactions = array();
foreach ($changes as $type => $value) {
$transaction = clone $template;
$transaction->setTransactionType($type);
$transaction->setNewValue($value);
$transactions[] = $transaction;
}
$transactions[] = id(new ManiphestTransaction())
->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
->setMetadataValue(
'edge:type',
PhabricatorProjectObjectHasProjectEdgeType::EDGECONST)
->setNewValue(
array(
'=' => array_fuse($this->getProjectPHIDs()),
));
// Apply Transactions
$editor = id(new ManiphestTransactionEditor())
->setActor($author)
->setContentSource($content_source)
->setContinueOnNoEffect(true)
->setContinueOnMissingFields(true)
->applyTransactions($task, $transactions);
return $task;
}
public function getCCPHIDs() {
$ccs = array();
for ($i = 0; $i < rand(1, 4);$i++) {
$ccs[] = $this->loadPhabricatorUserPHID();
}
return $ccs;
}
public function getProjectPHIDs() {
$projects = array();
for ($i = 0; $i < rand(1, 4);$i++) {
$project = $this->loadOneRandom('PhabricatorProject');
if ($project) {
$projects[] = $project->getPHID();
}
}
return $projects;
}
public function loadOwnerPHID() {
if (rand(0, 3) == 0) {
return null;
} else {
return $this->loadPhabricatorUserPHID();
}
}
public function generateTitle() {
return id(new PhutilLipsumContextFreeGrammar())
->generate();
}
public function generateDescription() {
return id(new PhutilLipsumContextFreeGrammar())
->generateSeveral(rand(30, 40));
}
public function generateTaskPriority() {
return array_rand(ManiphestTaskPriority::getTaskPriorityMap());
}
public function generateTaskSubPriority() {
return rand(2 << 16, 2 << 32);
}
public function generateTaskStatus() {
$statuses = array_keys(ManiphestTaskStatus::getTaskStatusMap());
// Make sure 4/5th of all generated Tasks are open
$random = rand(0, 4);
if ($random != 0) {
return ManiphestTaskStatus::getDefaultStatus();
} else {
return array_rand($statuses);
}
}
}
diff --git a/src/applications/paste/lipsum/PhabricatorPasteTestDataGenerator.php b/src/applications/paste/lipsum/PhabricatorPasteTestDataGenerator.php
index 43be2d0eba..24ac718606 100644
--- a/src/applications/paste/lipsum/PhabricatorPasteTestDataGenerator.php
+++ b/src/applications/paste/lipsum/PhabricatorPasteTestDataGenerator.php
@@ -1,99 +1,101 @@
<?php
final class PhabricatorPasteTestDataGenerator
extends PhabricatorTestDataGenerator {
+ const GENERATORKEY = 'pastes';
+
public function getGeneratorName() {
return pht('Pastes');
}
public function generateObject() {
$author = $this->loadRandomUser();
list($name, $language, $content) = $this->newPasteContent();
$paste = PhabricatorPaste::initializeNewPaste($author);
$xactions = array();
$xactions[] = $this->newTransaction(
PhabricatorPasteTitleTransaction::TRANSACTIONTYPE,
$name);
$xactions[] = $this->newTransaction(
PhabricatorPasteLanguageTransaction::TRANSACTIONTYPE,
$language);
$xactions[] = $this->newTransaction(
PhabricatorPasteContentTransaction::TRANSACTIONTYPE,
$content);
$editor = id(new PhabricatorPasteEditor())
->setActor($author)
->setContentSource($this->getLipsumContentSource())
->setContinueOnNoEffect(true)
->applyTransactions($paste, $xactions);
return $paste;
}
protected function newEmptyTransaction() {
return new PhabricatorPasteTransaction();
}
private function newPasteContent() {
$languages = array(
'txt' => array(),
'php' => array(
'content' => 'PhutilPHPCodeSnippetContextFreeGrammar',
),
'java' => array(
'content' => 'PhutilJavaCodeSnippetContextFreeGrammar',
),
);
$language = array_rand($languages);
$spec = $languages[$language];
$title_generator = idx($spec, 'title');
if (!$title_generator) {
$title_generator = 'PhabricatorPasteFilenameContextFreeGrammar';
}
$content_generator = idx($spec, 'content');
if (!$content_generator) {
$content_generator = 'PhutilLipsumContextFreeGrammar';
}
$title = newv($title_generator, array())
->generate();
$content = newv($content_generator, array())
->generateSeveral($this->roll(4, 12, 10));
// Usually add the language as a suffix.
if ($this->roll(1, 20) > 2) {
$title = $title.'.'.$language;
}
switch ($this->roll(1, 20)) {
case 1:
// On critical miss, set a different, random language.
$highlight_as = array_rand($languages);
break;
case 18:
case 19:
case 20:
// Sometimes set it to the correct language.
$highlight_as = $language;
break;
default:
// Usually leave it as autodetect.
$highlight_as = '';
break;
}
return array($title, $highlight_as, $content);
}
}
diff --git a/src/applications/people/lipsum/PhabricatorPeopleTestDataGenerator.php b/src/applications/people/lipsum/PhabricatorPeopleTestDataGenerator.php
index 9b05b4acb1..7fe5065a42 100644
--- a/src/applications/people/lipsum/PhabricatorPeopleTestDataGenerator.php
+++ b/src/applications/people/lipsum/PhabricatorPeopleTestDataGenerator.php
@@ -1,103 +1,105 @@
<?php
final class PhabricatorPeopleTestDataGenerator
extends PhabricatorTestDataGenerator {
+ const GENERATORKEY = 'users';
+
public function getGeneratorName() {
return pht('User Accounts');
}
public function generateObject() {
while (true) {
try {
$realname = $this->generateRealname();
$username = $this->generateUsername($realname);
$email = $this->generateEmail($username);
$admin = PhabricatorUser::getOmnipotentUser();
$user = new PhabricatorUser();
$user->setUsername($username);
$user->setRealname($realname);
$email_object = id(new PhabricatorUserEmail())
->setAddress($email)
->setIsVerified(1);
id(new PhabricatorUserEditor())
->setActor($admin)
->createNewUser($user, $email_object);
return $user;
} catch (AphrontDuplicateKeyQueryException $ex) {}
}
}
protected function generateRealname() {
$realname_generator = new PhutilRealNameContextFreeGrammar();
$random_real_name = $realname_generator->generate();
return $random_real_name;
}
protected function generateUsername($random_real_name) {
$name = strtolower($random_real_name);
$name = preg_replace('/[^a-z]/s' , ' ', $name);
$name = preg_replace('/\s+/', ' ', $name);
$words = explode(' ', $name);
$random = rand(0, 4);
$reduced = '';
if ($random == 0) {
foreach ($words as $w) {
if ($w == end($words)) {
$reduced .= $w;
} else {
$reduced .= $w[0];
}
}
} else if ($random == 1) {
foreach ($words as $w) {
if ($w == $words[0]) {
$reduced .= $w;
} else {
$reduced .= $w[0];
}
}
} else if ($random == 2) {
foreach ($words as $w) {
if ($w == $words[0] || $w == end($words)) {
$reduced .= $w;
} else {
$reduced .= $w[0];
}
}
} else if ($random == 3) {
foreach ($words as $w) {
if ($w == $words[0] || $w == end($words)) {
$reduced .= $w;
} else {
$reduced .= $w[0].'.';
}
}
} else if ($random == 4) {
foreach ($words as $w) {
if ($w == $words[0] || $w == end($words)) {
$reduced .= $w;
} else {
$reduced .= $w[0].'_';
}
}
}
$random1 = rand(0, 4);
if ($random1 >= 1) {
$reduced = ucfirst($reduced);
}
$username = $reduced;
return $username;
}
protected function generateEmail($username) {
$default_email_domain = 'example.com';
$email = $username.'@'.$default_email_domain;
return $email;
}
}
diff --git a/src/applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php b/src/applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php
index 9a274443cf..f81eb3e1d7 100644
--- a/src/applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php
+++ b/src/applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php
@@ -1,117 +1,119 @@
<?php
final class PhabricatorPholioMockTestDataGenerator
extends PhabricatorTestDataGenerator {
+ const GENERATORKEY = 'mocks';
+
public function getGeneratorName() {
return pht('Pholio Mocks');
}
public function generateObject() {
$author_phid = $this->loadPhabricatorUserPHID();
$author = id(new PhabricatorUser())
->loadOneWhere('phid = %s', $author_phid);
$mock = PholioMock::initializeNewMock($author);
$content_source = $this->getLipsumContentSource();
$template = id(new PholioTransaction())
->setContentSource($content_source);
// Accumulate Transactions
$changes = array();
$changes[PholioTransaction::TYPE_NAME] =
$this->generateTitle();
$changes[PholioTransaction::TYPE_DESCRIPTION] =
$this->generateDescription();
$changes[PhabricatorTransactions::TYPE_VIEW_POLICY] =
PhabricatorPolicies::POLICY_PUBLIC;
$changes[PhabricatorTransactions::TYPE_SUBSCRIBERS] =
array('=' => $this->getCCPHIDs());
// Get Files and make Images
$file_phids = $this->generateImages();
$files = id(new PhabricatorFileQuery())
->setViewer($author)
->withPHIDs($file_phids)
->execute();
$mock->setCoverPHID(head($files)->getPHID());
$sequence = 0;
$images = array();
foreach ($files as $file) {
$image = new PholioImage();
$image->setFilePHID($file->getPHID());
$image->setSequence($sequence++);
$image->attachMock($mock);
$images[] = $image;
}
// Apply Transactions
$transactions = array();
foreach ($changes as $type => $value) {
$transaction = clone $template;
$transaction->setTransactionType($type);
$transaction->setNewValue($value);
$transactions[] = $transaction;
}
$mock->openTransaction();
$editor = id(new PholioMockEditor())
->setContentSource($content_source)
->setContinueOnNoEffect(true)
->setActor($author)
->applyTransactions($mock, $transactions);
foreach ($images as $image) {
$image->setMockID($mock->getID());
$image->save();
}
$mock->saveTransaction();
return $mock->save();
}
public function generateTitle() {
return id(new PhutilLipsumContextFreeGrammar())
->generate();
}
public function generateDescription() {
return id(new PhutilLipsumContextFreeGrammar())
->generateSeveral(rand(30, 40));
}
public function getCCPHIDs() {
$ccs = array();
for ($i = 0; $i < rand(1, 4);$i++) {
$ccs[] = $this->loadPhabricatorUserPHID();
}
return $ccs;
}
public function generateImages() {
$images = newv('PhabricatorFile', array())
->loadAllWhere('mimeType = %s', 'image/jpeg');
$rand_images = array();
$quantity = rand(2, 10);
$quantity = min($quantity, count($images));
if ($quantity) {
$random_images = $quantity === 1 ?
array(array_rand($images, $quantity)) :
array_rand($images, $quantity);
foreach ($random_images as $random) {
$rand_images[] = $images[$random]->getPHID();
}
}
// This means you don't have any JPEGs yet. We'll just use a built-in image.
if (empty($rand_images)) {
$default = PhabricatorFile::loadBuiltin(
PhabricatorUser::getOmnipotentUser(),
'profile.png');
$rand_images[] = $default->getPHID();
}
return $rand_images;
}
}
diff --git a/src/applications/project/lipsum/PhabricatorProjectTestDataGenerator.php b/src/applications/project/lipsum/PhabricatorProjectTestDataGenerator.php
index 0b2e8e2943..0fd5bd66e7 100644
--- a/src/applications/project/lipsum/PhabricatorProjectTestDataGenerator.php
+++ b/src/applications/project/lipsum/PhabricatorProjectTestDataGenerator.php
@@ -1,70 +1,72 @@
<?php
final class PhabricatorProjectTestDataGenerator
extends PhabricatorTestDataGenerator {
+ const GENERATORKEY = 'projects';
+
public function getGeneratorName() {
return pht('Projects');
}
public function generateObject() {
$author = $this->loadRandomUser();
$project = PhabricatorProject::initializeNewProject($author);
$xactions = array();
$xactions[] = $this->newTransaction(
PhabricatorProjectTransaction::TYPE_NAME,
$this->newProjectTitle());
$xactions[] = $this->newTransaction(
PhabricatorProjectTransaction::TYPE_STATUS,
$this->newProjectStatus());
// Almost always make the author a member.
$members = array();
if ($this->roll(1, 20) > 2) {
$members[] = $author->getPHID();
}
// Add a few other members.
$size = $this->roll(2, 6, -2);
for ($ii = 0; $ii < $size; $ii++) {
$members[] = $this->loadRandomUser()->getPHID();
}
$xactions[] = $this->newTransaction(
PhabricatorTransactions::TYPE_EDGE,
array(
'+' => array_fuse($members),
),
array(
'edge:type' => PhabricatorProjectProjectHasMemberEdgeType::EDGECONST,
));
$editor = id(new PhabricatorProjectTransactionEditor())
->setActor($author)
->setContentSource($this->getLipsumContentSource())
->setContinueOnNoEffect(true)
->applyTransactions($project, $xactions);
return $project;
}
protected function newEmptyTransaction() {
return new PhabricatorProjectTransaction();
}
public function newProjectTitle() {
return id(new PhabricatorProjectNameContextFreeGrammar())
->generate();
}
public function newProjectStatus() {
if ($this->roll(1, 20) > 5) {
return PhabricatorProjectStatus::STATUS_ACTIVE;
} else {
return PhabricatorProjectStatus::STATUS_ARCHIVED;
}
}
}

File Metadata

Mime Type
text/x-diff
Expires
Sun, Jan 19, 14:32 (3 w, 2 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1125535
Default Alt Text
(30 KB)

Event Timeline