Skip to content

Commit

Permalink
Moving CodeGenerator class into bake shell.
Browse files Browse the repository at this point in the history
Updating FixtureTask and test cases.
Updating template for fixtures.
  • Loading branch information
markstory committed May 11, 2009
1 parent a6d1650 commit 3ea2b5a
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 119 deletions.
95 changes: 95 additions & 0 deletions cake/console/libs/bake.php
Expand Up @@ -218,4 +218,99 @@ function help() {

}
}

/**
* Similar to View but has no dependancy on controller
*
**/
class CodeGenerator {
/**
* variables to add to template scope
*
* @var array
**/
var $templateVars = array();
/**
* set the paths for the code generator to search for templates
*
* @param array $paths Array of paths to look in
* @access public
* @return void
**/
function setPaths($paths) {
$this->_paths = $paths;
}

/**
* Find a template
*
* @param string $directory Subdirectory to look for ie. 'views', 'objects'
* @param string $filename lower_case_underscored filename you want.
* @access public
* @return string filename or false if scan failed.
**/
function _findTemplate($directory, $filename) {
foreach ($this->_paths as $path) {
$templatePath = $path . 'templates' . DS . $directory . DS . $filename . '.ctp';
if (file_exists($templatePath) && is_file($templatePath)) {
return $templatePath;
}
}
return false;
}

/**
* Set variable values to the template scope
*
* @param mixed $one A string or an array of data.
* @param mixed $two Value in case $one is a string (which then works as the key).
* Unused if $one is an associative array, otherwise serves as the values to $one's keys.
* @return void
*/
function set($one, $two = null) {
$data = null;
if (is_array($one)) {
if (is_array($two)) {
$data = array_combine($one, $two);
} else {
$data = $one;
}
} else {
$data = array($one => $two);
}

if ($data == null) {
return false;
}

foreach ($data as $name => $value) {
$this->templateVars[$name] = $value;
}
}

/**
* Runs the template
*
* @param string $directory directory / type of thing you want
* @param string $filename template name
* @param string $vars Additional vars to set to template scope.
* @access public
* @return contents of generated code template
**/
function generate($directory, $filename, $vars = null) {
if ($vars !== null) {
$this->set($vars);
}
$templateFile = $this->_findTemplate($directory, $filename);
if ($templateFile) {
extract($this->templateVars);
ob_start();
ob_implicit_flush(0);
include($templateFile);
$content = ob_get_clean();
return $content;
}
return '';
}
}
?>
136 changes: 23 additions & 113 deletions cake/console/libs/tasks/fixture.php
Expand Up @@ -154,16 +154,14 @@ function importOptions($modelName) {
* @access private
*/
function bake($model, $useTable = false, $importOptions = array()) {
$out = "class {$model}Fixture extends CakeTestFixture {\n";
$out .= "\tvar \$name = '$model';\n";

$table = $schema = $records = $import = null;
if (!$useTable) {
$useTable = Inflector::tableize($model);
} elseif ($useTable != Inflector::tableize($model)) {
$out .= "\tvar \$table = '$useTable';\n";
$table = $useTable;
}

$modelImport = $recordImport = null;
$modelImport = $import = $recordImport = null;
if (!empty($importOptions)) {
if (isset($importOptions['schema'])) {
$modelImport = "'model' => '{$importOptions['schema']}'";
Expand All @@ -174,7 +172,7 @@ function bake($model, $useTable = false, $importOptions = array()) {
if ($modelImport && $recordImport) {
$modelImport .= ', ';
}
$out .= sprintf("\tvar \$import = array(%s%s);\n", $modelImport, $recordImport);
$import = sprintf("array(%s%s);\n", $modelImport, $recordImport);
}

$this->_Schema = new CakeSchema();
Expand All @@ -187,18 +185,17 @@ function bake($model, $useTable = false, $importOptions = array()) {

$tableInfo = $data['tables'][$useTable];
if (is_null($modelImport)) {
$out .= $this->_generateSchema($tableInfo);
$schema = $this->_generateSchema($tableInfo);
}

if (is_null($recordImport)) {
$recordCount = 1;
if (isset($this->params['count'])) {
$recordCount = $this->params['count'];
}
$out .= $this->_generateRecords($tableInfo, $recordCount);
$records = $this->_generateRecords($tableInfo, $recordCount);
}
$out .= "}\n";
$this->generateFixtureFile($model, $out);
$out = $this->generateFixtureFile($model, compact('records', 'table', 'schema', 'import', 'fields'));
return $out;
}

Expand All @@ -210,19 +207,27 @@ function bake($model, $useTable = false, $importOptions = array()) {
* @access public
* @return void
**/
function generateFixtureFile($model, $fixture) {
function generateFixtureFile($model, $otherVars) {
$defaults = array('table' => null, 'schema' => null, 'records' => null, 'import' => null, 'fields' => null);
$vars = array_merge($defaults, $otherVars);

//@todo fix plugin pathing.
$path = $this->path;
if (isset($this->plugin)) {
$pluginPath = 'plugins' . DS . Inflector::underscore($this->plugin) . DS;
$path = APP . $pluginPath . 'tests' . DS . 'fixtures' . DS;
}
$filename = Inflector::underscore($model) . '_fixture.php';
$content = "<?php\n/* " . $model . " Fixture generated on: " . date('Y-m-d H:m:s') . " : ". time() . "*/\n";
$content .= $fixture;
$content .= "?>";

$Generator = new CodeGenerator();
$Generator->setPaths($this->Dispatch->shellPaths);
$Generator->set('model', $model);
$Generator->set($vars);
$content = $Generator->generate('objects', 'fixture');

$this->out("\nBaking test fixture for $model...");
$this->createFile($path . $filename, $content);
return $content;
}

/**
Expand All @@ -233,7 +238,7 @@ function generateFixtureFile($model, $fixture) {
**/
function _generateSchema($tableInfo) {
$cols = array();
$out = "\n\tvar \$fields = array(\n";
$out = "array(\n";
foreach ($tableInfo as $field => $fieldInfo) {
if (is_array($fieldInfo)) {
if ($field != 'indexes') {
Expand All @@ -252,7 +257,7 @@ function _generateSchema($tableInfo) {
}
}
$out .= join(",\n", $cols);
$out .= "\n\t);\n\n";
$out .= "\n\t)";
return $out;
}

Expand All @@ -263,7 +268,7 @@ function _generateSchema($tableInfo) {
* @return string
**/
function _generateRecords($tableInfo, $recordCount = 1) {
$out = "\tvar \$records = array(\n";
$out = "array(\n";

for ($i = 0; $i < $recordCount; $i++) {
$records = array();
Expand Down Expand Up @@ -317,7 +322,7 @@ function _generateRecords($tableInfo, $recordCount = 1) {
$out .= implode(",\n", $records);
$out .= "\n\t\t),\n";
}
$out .= "\t);\n";
$out .= "\t)";
return $out;
}

Expand All @@ -342,99 +347,4 @@ function help() {
$this->_stop();
}
}

/**
* Similar to View but has no dependancy on controller
*
**/
class CodeGenerator {
/**
* variables to add to template scope
*
* @var array
**/
var $templateVars = array();
/**
* set the paths for the code generator to search for templates
*
* @param array $paths Array of paths to look in
* @access public
* @return void
**/
function setPaths($paths) {
$this->_paths = $paths;
}

/**
* Find a template
*
* @param string $directory Subdirectory to look for ie. 'views', 'objects'
* @param string $filename lower_case_underscored filename you want.
* @access public
* @return string filename or false if scan failed.
**/
function _findTemplate($directory, $filename) {
foreach ($this->_paths as $path) {
$templatePath = $path . 'templates' . DS . $directory . DS . $filename . '.ctp';
if (file_exists($templatePath) && is_file($templatePath)) {
return $templatePath;
}
}
return false;
}

/**
* Set variable values to the template scope
*
* @param mixed $one A string or an array of data.
* @param mixed $two Value in case $one is a string (which then works as the key).
* Unused if $one is an associative array, otherwise serves as the values to $one's keys.
* @return void
*/
function set($one, $two = null) {
$data = null;
if (is_array($one)) {
if (is_array($two)) {
$data = array_combine($one, $two);
} else {
$data = $one;
}
} else {
$data = array($one => $two);
}

if ($data == null) {
return false;
}

foreach ($data as $name => $value) {
$this->viewVars[$name] = $value;
}
}

/**
* Runs the template
*
* @param string $directory directory / type of thing you want
* @param string $filename template name
* @param string $vars Additional vars to set to template scope.
* @access public
* @return contents of generated code template
**/
function generate($directory, $filename, $vars = null) {
if ($vars !== null) {
$this->set($vars);
}
$templateFile = $this->_findTemplate($directory, $filename);
if ($templateFile) {
extract($this->templateVars);
ob_start();
ob_implicit_flush(0);
include($templatePath);
$content = ob_get_clean();
return $content;
}
return '';
}
}
?>
8 changes: 5 additions & 3 deletions cake/console/libs/templates/objects/fixture.ctp
Expand Up @@ -20,19 +20,21 @@
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
?>
<?php echo '<?php'; ?>
<?php echo '<?php' . "\n"; ?>
/* <?php echo $model; ?> Fixture generated on: <?php echo date('Y-m-d H:m:s') . " : ". time(); ?> */
class <?php echo $model; ?>Fixture extends CakeTestFixture {
var $name = '<?php echo $model; ?>';
<?php if ($useTable): ?>
var $table = '<?php echo $useTable; ?>';
<?php if ($table): ?>
var $table = '<?php echo $table; ?>';
<?php endif; ?>
<?php if ($import): ?>
var $import = <?php echo $import; ?>;
<?php endif;?>

<?php if ($schema): ?>
var $fields = <?php echo $schema; ?>;
<?php endif;?>

<?php if ($records): ?>
var $records = <?php echo $records; ?>;
<?php endif;?>
Expand Down
8 changes: 5 additions & 3 deletions cake/tests/cases/console/libs/tasks/fixture.test.php
Expand Up @@ -38,6 +38,7 @@
}

if (!class_exists('FixtureTask')) {
require CAKE . 'console' . DS . 'libs' . DS . 'bake.php';
require CAKE . 'console' . DS . 'libs' . DS . 'tasks' . DS . 'fixture.php';
}

Expand Down Expand Up @@ -79,6 +80,7 @@ function startTest() {
$this->Task =& new MockFixtureTask();
$this->Task->Model =& new MockFixtureModelTask();
$this->Task->Dispatch = new $this->Dispatcher;
$this->Task->Dispatch->shellPaths = Configure::read('shellPaths');
}
/**
* tearDown method
Expand Down Expand Up @@ -216,11 +218,11 @@ function testGenerateFixtureFile() {
$this->Task->path = '/my/path/';
$filename = '/my/path/article_fixture.php';

$this->Task->expectAt(0, 'createFile', array($filename, new PatternExpectation('/my fixture/')));
$result = $this->Task->generateFixtureFile('Article', 'my fixture');
$this->Task->expectAt(0, 'createFile', array($filename, new PatternExpectation('/Article/')));
$result = $this->Task->generateFixtureFile('Article', array());

$this->Task->expectAt(1, 'createFile', array($filename, new PatternExpectation('/\<\?php(.*)\?\>/ms')));
$result = $this->Task->generateFixtureFile('Article', 'my fixture');
$result = $this->Task->generateFixtureFile('Article', array());
}
}
?>

0 comments on commit 3ea2b5a

Please sign in to comment.