ソースを参照

Completing support for extracting model validation messages from application plugins

Jose Lorenzo Rodriguez 14 年 前
コミット
eaa80bbced

+ 10 - 3
lib/Cake/Console/Command/Task/ExtractTask.php

@@ -132,6 +132,7 @@ class ExtractTask extends Shell {
 				CakePlugin::load($plugin);
 			}
 			$this->_paths = array(CakePlugin::path($plugin));
+			$this->params['plugin'] = $plugin;
 		} else {
 			$defaultPath = APP;
 			$message = __d('cake_console', "What is the path you would like to extract?\n[Q]uit [D]one");
@@ -157,7 +158,7 @@ class ExtractTask extends Shell {
 			$this->_exclude = array_merge($this->_exclude, App::path('plugins'));
 		}
 
-		if (!empty($this->params['ignore-model-validation']) || !$this->_isExtractingApp()) {
+		if (!empty($this->params['ignore-model-validation']) || (!$this->_isExtractingApp() && empty($plugin))) {
 			$this->_extractValidation = false;
 		}
 		if (!empty($this->params['validation-domain'])) {
@@ -354,10 +355,16 @@ class ExtractTask extends Shell {
 		if (!$this->_extractValidation) {
 			return;
 		}
-		$models = App::objects('Model', null, false);
 		App::uses('AppModel', 'Model');
+		$plugin = null;
+		if (!empty($this->params['plugin'])) {
+			App::uses($this->params['plugin'] . 'AppModel', $this->params['plugin'] . '.Model');
+			$plugin = $this->params['plugin'] . '.';
+		}
+		$models = App::objects($plugin . 'Model', null, false);
+
 		foreach ($models as $model) {
-			App::uses($model, 'Model');
+			App::uses($model, $plugin . 'Model');
 			$reflection = new ReflectionClass($model);
 			$properties = $reflection->getDefaultProperties();
 			$validate = $properties['validate'];

+ 43 - 1
lib/Cake/Test/Case/Console/Command/Task/ExtractTaskTest.php

@@ -61,6 +61,7 @@ class ExtractTaskTest extends CakeTestCase {
 		$Folder = new Folder($this->path);
 		$Folder->delete();
 		App::build();
+		CakePlugin::unload();
 	}
 
 /**
@@ -255,7 +256,6 @@ class ExtractTaskTest extends CakeTestCase {
 		$this->assertNoPattern('#Pages#', $result);
 		$this->assertContains('translate.ctp:1', $result);
 		$this->assertContains('This is a translatable string', $result);
-		CakePlugin::unload();
 	}
 
 /**
@@ -342,4 +342,46 @@ class ExtractTaskTest extends CakeTestCase {
 		$this->assertPattern($pattern, $result);
 	}
 
+
+/**
+ *  Test that the extract shell can obtain validation messages from models inside a specific plugin
+ *
+ * @return void
+ */
+	public function testExtractModelValidationInPlugin() {
+		App::build(array(
+			'plugins' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)
+		));
+		$this->out = $this->getMock('ConsoleOutput', array(), array(), '', false);
+		$this->in = $this->getMock('ConsoleInput', array(), array(), '', false);
+		$this->Task = $this->getMock('ExtractTask',
+			array('_isExtractingApp', 'in', 'out', 'err', 'clear', '_stop'),
+			array($this->out, $this->out, $this->in)
+		);
+
+		$this->Task->params['output'] = $this->path . DS;
+		$this->Task->params['ignore-model-validation'] = false;
+		$this->Task->params['plugin'] = 'TestPlugin';
+
+		$this->Task->execute();
+		$result = file_get_contents($this->path . DS . 'test_plugin.pot');
+
+		$pattern = '#Model/TestPluginPost.php:validation for field title#';
+		$this->assertPattern($pattern, $result);
+
+		$pattern = '#Model/TestPluginPost.php:validation for field body#';
+		$this->assertPattern($pattern, $result);
+
+		$pattern = '#msgid "Post title is required"#';
+		$this->assertPattern($pattern, $result);
+
+		$pattern = '#msgid "Post body is required"#';
+		$this->assertPattern($pattern, $result);
+
+		$pattern = '#msgid "Post body is super required"#';
+		$this->assertPattern($pattern, $result);
+
+		$pattern = '#Plugin/TestPlugin/Model/TestPluginPost.php:validation for field title#';
+		$this->assertNoPattern($pattern, $result);
+	}
 }