Allow behaviors to be added to bake templates and improve doc blocks

This commit is contained in:
euromark 2013-03-15 12:14:06 +01:00
parent 0900c32c03
commit dab0c5e753
3 changed files with 87 additions and 13 deletions

View file

@ -164,7 +164,7 @@ class ModelTask extends BakeTask {
* @param array $options Array of options to use for the selections. indexes must start at 0 * @param array $options Array of options to use for the selections. indexes must start at 0
* @param string $prompt Prompt to use for options list. * @param string $prompt Prompt to use for options list.
* @param integer $default The default option for the given prompt. * @param integer $default The default option for the given prompt.
* @return integer result of user choice. * @return integer Result of user choice.
*/ */
public function inOptions($options, $prompt = null, $default = null) { public function inOptions($options, $prompt = null, $default = null) {
$valid = false; $valid = false;
@ -347,7 +347,7 @@ class ModelTask extends BakeTask {
* @return array $validate Array of user selected validations. * @return array $validate Array of user selected validations.
*/ */
public function doValidation($model) { public function doValidation($model) {
if (!is_object($model)) { if (!$model instanceof Model) {
return false; return false;
} }
$fields = $model->schema(); $fields = $model->schema();
@ -490,10 +490,10 @@ class ModelTask extends BakeTask {
* Handles associations * Handles associations
* *
* @param Model $model * @param Model $model
* @return array $associations * @return array Associations
*/ */
public function doAssociations($model) { public function doAssociations($model) {
if (!is_object($model)) { if (!$model instanceof Model) {
return false; return false;
} }
if ($this->interactive === true) { if ($this->interactive === true) {
@ -538,12 +538,36 @@ class ModelTask extends BakeTask {
return $associations; return $associations;
} }
/**
* Handles behaviors
*
* @param Model $model
* @return array Behaviors
*/
public function doActsAs($model) {
if (!$model instanceof Model) {
return false;
}
$behaviors = array();
$fields = $model->schema(true);
if (empty($fields)) {
return array();
}
if (isset($fields['lft']) && $fields['lft']['type'] === 'integer' &&
isset($fields['rght']) && $fields['rght']['type'] === 'integer' &&
isset($fields['parent_id'])) {
$behaviors[] = 'Tree';
}
return $behaviors;
}
/** /**
* Find belongsTo relations and add them to the associations list. * Find belongsTo relations and add them to the associations list.
* *
* @param Model $model Model instance of model being generated. * @param Model $model Model instance of model being generated.
* @param array $associations Array of in progress associations * @param array $associations Array of in progress associations
* @return array $associations with belongsTo added in. * @return array Associations with belongsTo added in.
*/ */
public function findBelongsTo(Model $model, $associations) { public function findBelongsTo(Model $model, $associations) {
$fieldNames = array_keys($model->schema(true)); $fieldNames = array_keys($model->schema(true));
@ -572,7 +596,7 @@ class ModelTask extends BakeTask {
* *
* @param Model $model Model instance being generated * @param Model $model Model instance being generated
* @param array $associations Array of in progress associations * @param array $associations Array of in progress associations
* @return array $associations with hasOne and hasMany added in. * @return array Associations with hasOne and hasMany added in.
*/ */
public function findHasOneAndMany(Model $model, $associations) { public function findHasOneAndMany(Model $model, $associations) {
$foreignKey = $this->_modelKey($model->name); $foreignKey = $this->_modelKey($model->name);
@ -615,7 +639,7 @@ class ModelTask extends BakeTask {
* *
* @param Model $model Model instance being generated * @param Model $model Model instance being generated
* @param array $associations Array of in-progress associations * @param array $associations Array of in-progress associations
* @return array $associations with hasAndBelongsToMany added in. * @return array Associations with hasAndBelongsToMany added in.
*/ */
public function findHasAndBelongsToMany(Model $model, $associations) { public function findHasAndBelongsToMany(Model $model, $associations) {
$foreignKey = $this->_modelKey($model->name); $foreignKey = $this->_modelKey($model->name);
@ -747,7 +771,7 @@ class ModelTask extends BakeTask {
/** /**
* Finds all possible keys to use on custom associations. * Finds all possible keys to use on custom associations.
* *
* @return array array of tables and possible keys * @return array Array of tables and possible keys
*/ */
protected function _generatePossibleKeys() { protected function _generatePossibleKeys() {
$possible = array(); $possible = array();
@ -771,11 +795,12 @@ class ModelTask extends BakeTask {
* @return string * @return string
*/ */
public function bake($name, $data = array()) { public function bake($name, $data = array()) {
if (is_object($name)) { if ($name instanceof Model) {
if (!$data) { if (!$data) {
$data = array(); $data = array();
$data['associations'] = $this->doAssociations($name); $data['associations'] = $this->doAssociations($name);
$data['validate'] = $this->doValidation($name); $data['validate'] = $this->doValidation($name);
$data['actsAs'] = $this->doActsAs($name);
} }
$data['primaryKey'] = $name->primaryKey; $data['primaryKey'] = $name->primaryKey;
$data['useTable'] = $name->table; $data['useTable'] = $name->table;
@ -784,8 +809,10 @@ class ModelTask extends BakeTask {
} else { } else {
$data['name'] = $name; $data['name'] = $name;
} }
$defaults = array( $defaults = array(
'associations' => array(), 'associations' => array(),
'actsAs' => array(),
'validate' => array(), 'validate' => array(),
'primaryKey' => 'id', 'primaryKey' => 'id',
'useTable' => null, 'useTable' => null,
@ -920,7 +947,7 @@ class ModelTask extends BakeTask {
* Forces the user to specify the model he wants to bake, and returns the selected model name. * Forces the user to specify the model he wants to bake, and returns the selected model name.
* *
* @param string $useDbConfig Database config name * @param string $useDbConfig Database config name
* @return string the model name * @return string The model name
*/ */
public function getName($useDbConfig = null) { public function getName($useDbConfig = null) {
$this->listAll($useDbConfig); $this->listAll($useDbConfig);

View file

@ -74,6 +74,16 @@ if ($displayField): ?>
<?php endif; <?php endif;
if (!empty($actsAs)): ?>
/**
* Behaviors
*
* @var array
*/
public $actsAs = array(<?php echo "\n\t"; foreach ($actsAs as $behavior): echo "\t"; var_export($behavior); echo ",\n\t"; endforeach; ?>);
<?php endif;
if (!empty($validate)): if (!empty($validate)):
echo "/**\n * Validation rules\n *\n * @var array\n */\n"; echo "/**\n * Validation rules\n *\n * @var array\n */\n";
echo "\tpublic \$validate = array(\n"; echo "\tpublic \$validate = array(\n";

View file

@ -42,7 +42,7 @@ class ModelTaskTest extends CakeTestCase {
*/ */
public $fixtures = array( public $fixtures = array(
'core.bake_article', 'core.bake_comment', 'core.bake_articles_bake_tag', 'core.bake_article', 'core.bake_comment', 'core.bake_articles_bake_tag',
'core.bake_tag', 'core.category_thread' 'core.bake_tag', 'core.category_thread', 'core.number_tree'
); );
/** /**
@ -623,6 +623,20 @@ class ModelTaskTest extends CakeTestCase {
$this->assertEquals($expected, $result); $this->assertEquals($expected, $result);
} }
/**
* test non interactive doActsAs
*
* @return void
*/
public function testDoActsAs() {
$this->Task->connection = 'test';
$this->Task->interactive = false;
$model = new Model(array('ds' => 'test', 'name' => 'NumberTree'));
$result = $this->Task->doActsAs($model);
$this->assertEquals(array('Tree'), $result);
}
/** /**
* Ensure that the fixture object is correctly called. * Ensure that the fixture object is correctly called.
* *
@ -836,6 +850,27 @@ STRINGEND;
$this->assertEquals(count(ClassRegistry::mapKeys()), 0); $this->assertEquals(count(ClassRegistry::mapKeys()), 0);
} }
/**
* test bake() for models with behaviors
*
* @return void
*/
public function testBakeWithBehaviors() {
$result = $this->Task->bake('NumberTree', array('actsAs' => array('Tree', 'PluginName.Sluggable')));
$expected = <<<TEXT
/**
* Behaviors
*
* @var array
*/
public \$actsAs = array(
'Tree',
'PluginName.Sluggable',
);
TEXT;
$this->assertTextContains($expected, $result);
}
/** /**
* test that execute passes runs bake depending with named model. * test that execute passes runs bake depending with named model.
* *
@ -987,7 +1022,7 @@ STRINGEND;
$out = $this->getMock('ConsoleOutput', array(), array(), '', false); $out = $this->getMock('ConsoleOutput', array(), array(), '', false);
$in = $this->getMock('ConsoleInput', array(), array(), '', false); $in = $this->getMock('ConsoleInput', array(), array(), '', false);
$this->Task = $this->getMock('ModelTask', $this->Task = $this->getMock('ModelTask',
array('in', 'err', '_stop', '_checkUnitTest', 'getAllTables', '_getModelObject', 'doAssociations', 'doValidation', 'createFile'), array('in', 'err', '_stop', '_checkUnitTest', 'getAllTables', '_getModelObject', 'doAssociations', 'doValidation', 'doActsAs', 'createFile'),
array($out, $out, $in) array($out, $out, $in)
); );
$this->_setupOtherMocks(); $this->_setupOtherMocks();
@ -1001,6 +1036,7 @@ STRINGEND;
$this->Task->expects($this->once())->method('_getModelObject')->will($this->returnValue($object)); $this->Task->expects($this->once())->method('_getModelObject')->will($this->returnValue($object));
$this->Task->expects($this->once())->method('doAssociations')->will($this->returnValue(array())); $this->Task->expects($this->once())->method('doAssociations')->will($this->returnValue(array()));
$this->Task->expects($this->once())->method('doValidation')->will($this->returnValue(array())); $this->Task->expects($this->once())->method('doValidation')->will($this->returnValue(array()));
$this->Task->expects($this->once())->method('doActsAs')->will($this->returnValue(array()));
$filename = '/my/path/BakeOdd.php'; $filename = '/my/path/BakeOdd.php';
$this->Task->expects($this->once())->method('createFile') $this->Task->expects($this->once())->method('createFile')
@ -1042,7 +1078,7 @@ STRINGEND;
$out = $this->getMock('ConsoleOutput', array(), array(), '', false); $out = $this->getMock('ConsoleOutput', array(), array(), '', false);
$in = $this->getMock('ConsoleInput', array(), array(), '', false); $in = $this->getMock('ConsoleInput', array(), array(), '', false);
$this->Task = $this->getMock('ModelTask', $this->Task = $this->getMock('ModelTask',
array('in', 'err', '_stop', '_checkUnitTest', 'getAllTables', '_getModelObject', 'doAssociations', 'doValidation', 'createFile'), array('in', 'err', '_stop', '_checkUnitTest', 'getAllTables', '_getModelObject', 'doAssociations', 'doValidation', 'doActsAs', 'createFile'),
array($out, $out, $in) array($out, $out, $in)
); );
$this->_setupOtherMocks(); $this->_setupOtherMocks();
@ -1056,6 +1092,7 @@ STRINGEND;
$this->Task->expects($this->once())->method('_getModelObject')->will($this->returnValue($object)); $this->Task->expects($this->once())->method('_getModelObject')->will($this->returnValue($object));
$this->Task->expects($this->once())->method('doAssociations')->will($this->returnValue(array())); $this->Task->expects($this->once())->method('doAssociations')->will($this->returnValue(array()));
$this->Task->expects($this->once())->method('doValidation')->will($this->returnValue(array())); $this->Task->expects($this->once())->method('doValidation')->will($this->returnValue(array()));
$this->Task->expects($this->once())->method('doActsAs')->will($this->returnValue(array()));
$filename = '/my/path/BakeOdd.php'; $filename = '/my/path/BakeOdd.php';
$this->Task->expects($this->once())->method('createFile') $this->Task->expects($this->once())->method('createFile')