PageRenderTime 53ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/app/Plugin/Tools/Console/Command/CcShell.php

https://gitlab.com/participatorio/estacaojuventude_php-angular
PHP | 389 lines | 239 code | 57 blank | 93 comment | 21 complexity | 539a080191632830fc2d6b34f1f127be MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception
  1. <?php
  2. App::uses('AppShell', 'Console/Command');
  3. App::uses('Folder', 'Utility');
  4. App::uses('File', 'Utility');
  5. if (!defined('LF')) {
  6. define('LF', PHP_EOL); // Use PHP to detect default linebreak
  7. }
  8. /**
  9. * Code Completion Shell
  10. * Workes perfectly with PHPDesigner - but should also work with most other IDEs out of the box
  11. *
  12. * @version 1.1
  13. * @author Mark Scherer
  14. * @license MIT
  15. */
  16. class CcShell extends AppShell {
  17. public $plugins = null;
  18. public $content = '';
  19. public $appFiles = array();
  20. /**
  21. * CcShell::main()
  22. *
  23. * @return void
  24. */
  25. public function main() {
  26. $this->out('Code Completion Dump - customized for PHPDesigner');
  27. $this->filename = APP . 'CodeCompletion.php';
  28. // get classes
  29. $this->models();
  30. $this->behaviors();
  31. $this->controller();
  32. $this->helpers();
  33. $this->appFiles();
  34. // write to file
  35. $this->_dump();
  36. $this->out('...done');
  37. }
  38. /**
  39. * CcShell::models()
  40. *
  41. * @return void
  42. */
  43. public function models() {
  44. $files = $this->_getFiles('Model');
  45. $content = LF;
  46. $content .= '/*** model start ***/' . LF;
  47. $content .= 'class AppModel extends Model {' . LF;
  48. if (!empty($files)) {
  49. $content .= $this->_prepModels($files);
  50. }
  51. $content .= '}' . LF;
  52. $content .= '/*** model end ***/' . LF;
  53. $this->content .= $content;
  54. }
  55. /**
  56. * CcShell::behaviors()
  57. *
  58. * @return void
  59. */
  60. public function behaviors() {
  61. $files = $this->_getFiles('Model/Behavior');
  62. $content = LF;
  63. $content .= '/*** behavior start ***/' . LF;
  64. $content .= 'class AppModel extends Model {' . LF;
  65. if (!empty($files)) {
  66. $content .= $this->_prepBehaviors($files);
  67. }
  68. $content .= '}' . LF;
  69. $content .= '/*** behavior end ***/' . LF;
  70. $this->content .= $content;
  71. }
  72. /**
  73. * Components + models
  74. *
  75. * @return void
  76. */
  77. public function controller() {
  78. $content = LF;
  79. $content .= '/*** component start ***/' . LF;
  80. $content .= 'class AppController extends Controller {' . LF;
  81. $files = $this->_getFiles('Controller/Component');
  82. if (!empty($files)) {
  83. $content .= $this->_prepComponents($files);
  84. }
  85. $content .= LF . LF;
  86. $files = $this->_getFiles('Model');
  87. if (!empty($files)) {
  88. $content .= $this->_prepModels($files);
  89. }
  90. $content .= '}' . LF;
  91. $content .= '/*** component end ***/' . LF;
  92. $this->content .= $content;
  93. }
  94. /**
  95. * CcShell::helpers()
  96. *
  97. * @return void
  98. */
  99. public function helpers() {
  100. $files = $this->_getFiles('View/Helper');
  101. $content = LF;
  102. $content .= '/*** helper start ***/' . LF;
  103. $content .= 'class AppHelper extends Helper {' . LF;
  104. if (!empty($files)) {
  105. $content .= $this->_prepHelpers($files);
  106. }
  107. $content .= '}' . LF;
  108. $content .= '/*** helper end ***/' . LF;
  109. $this->content .= $content;
  110. }
  111. /**
  112. * CcShell::appFiles()
  113. *
  114. * @return void
  115. */
  116. public function appFiles() {
  117. $files = $this->appFiles;
  118. $content = LF;
  119. $content .= '/*** plugin files start ***/' . LF;
  120. if (!empty($files)) {
  121. $content .= $this->_prepAppFiles($files);
  122. }
  123. $content .= '/*** plugin files end ***/' . LF;
  124. $this->content .= $content;
  125. }
  126. /**
  127. * CcShell::_prepAppFiles()
  128. *
  129. * @param mixed $files
  130. * @return string
  131. */
  132. protected function _prepAppFiles($files) {
  133. $res = '';
  134. foreach ($files as $name => $parent) {
  135. $res .= 'class ' . $name . ' extends ' . $parent . ' {}' . LF;
  136. }
  137. return $res;
  138. }
  139. /**
  140. * CcShell::_prepModels()
  141. *
  142. * @param mixed $files
  143. * @return string
  144. */
  145. protected function _prepModels($files) {
  146. $res = '';
  147. foreach ($files as $name) {
  148. $res .= '
  149. /**
  150. * ' . $name . '
  151. *
  152. * @var ' . $name . '
  153. */
  154. public $' . $name . ';
  155. ' . LF;
  156. }
  157. $res .= ' public function __construct() {';
  158. foreach ($files as $name) {
  159. $res .= '
  160. $this->' . $name . ' = new ' . $name . '();';
  161. }
  162. $res .= LF . ' }' . LF;
  163. return $res;
  164. }
  165. /**
  166. * CcShell::_prepBehaviors()
  167. *
  168. * @param mixed $files
  169. * @return string
  170. */
  171. protected function _prepBehaviors($files) {
  172. $res = '';
  173. foreach ($files as $name) {
  174. if (!($varName = $this->_varName($name, 'Behavior'))) {
  175. continue;
  176. }
  177. $res .= '
  178. /**
  179. * ' . $name . 'Behavior
  180. *
  181. * @var ' . $varName . '
  182. */
  183. public $' . $varName . ';
  184. ' . LF;
  185. }
  186. $res .= ' public function __construct() {';
  187. foreach ($files as $name) {
  188. if (!($varName = $this->_varName($name, 'Behavior'))) {
  189. continue;
  190. }
  191. $res .= '
  192. $this->' . $varName . ' = new ' . $name . '();';
  193. }
  194. $res .= LF . ' }' . LF;
  195. return $res;
  196. }
  197. /**
  198. * Check on correctness to avoid duplicates
  199. *
  200. * @return void
  201. */
  202. protected function _varName($name, $type) {
  203. if (($pos = strrpos($name, $type)) === false) {
  204. return '';
  205. }
  206. return substr($name, 0, $pos);
  207. }
  208. /**
  209. * CcShell::_prepComponents()
  210. *
  211. * @param mixed $files
  212. * @return string
  213. */
  214. protected function _prepComponents($files) {
  215. $res = '';
  216. foreach ($files as $name) {
  217. if (!($varName = $this->_varName($name, 'Component'))) {
  218. continue;
  219. }
  220. $res .= '
  221. /**
  222. * ' . $name . '
  223. *
  224. * @var ' . $varName . '
  225. */
  226. public $' . $varName . ';
  227. ' . LF;
  228. }
  229. $res .= ' public function __construct() {';
  230. foreach ($files as $name) {
  231. if (!($varName = $this->_varName($name, 'Component'))) {
  232. continue;
  233. }
  234. $res .= '
  235. $this->' . $varName . ' = new ' . $name . '();';
  236. }
  237. $res .= LF . ' }' . LF;
  238. return $res;
  239. }
  240. /**
  241. * CcShell::_prepHelpers()
  242. *
  243. * @param mixed $files
  244. * @return string
  245. */
  246. protected function _prepHelpers($files) {
  247. // new ones
  248. $res = '';
  249. foreach ($files as $name) {
  250. if (!($varName = $this->_varName($name, 'Helper'))) {
  251. continue;
  252. }
  253. $res .= '
  254. /**
  255. * ' . $name . '
  256. *
  257. * @var ' . $varName . '
  258. */
  259. public $' . $varName . ';
  260. ' . LF;
  261. }
  262. $res .= ' public function __construct() {';
  263. foreach ($files as $name) {
  264. if (!($varName = $this->_varName($name, 'Helper'))) {
  265. continue;
  266. }
  267. $res .= '
  268. $this->' . $varName . ' = new ' . $name . '();';
  269. }
  270. $res .= LF . ' }' . LF;
  271. return $res;
  272. }
  273. /**
  274. * CcShell::_dump()
  275. *
  276. * @return void
  277. */
  278. protected function _dump() {
  279. //$File = new File($this->filename, true);
  280. $content = '<?php exit();' . PHP_EOL . PHP_EOL;
  281. $content .= 'class CodeCompletion {' . PHP_EOL;
  282. $content .= '}' . PHP_EOL . PHP_EOL;
  283. $content .= '//Printed: ' . date('d.m.Y, H:i:s') . PHP_EOL;
  284. $content .= $this->content;
  285. //return $File->write($content);
  286. file_put_contents($this->filename, $content);
  287. }
  288. /**
  289. * CcShell::_getFiles()
  290. *
  291. * @param mixed $type
  292. * @return array
  293. */
  294. protected function _getFiles($type) {
  295. $files = App::objects($type, null, false);
  296. $corePath = App::core($type);
  297. $coreFiles = App::objects($type, $corePath, false);
  298. $files = array_merge($coreFiles, $files);
  299. //$paths = (array)App::path($type.'s');
  300. //$libFiles = App::objects($type, $paths[0] . 'lib' . DS, false);
  301. $appIndex = array_search('AppModel', $files);
  302. if ($appIndex !== false) {
  303. unset($files[$appIndex]);
  304. }
  305. if (!isset($this->plugins)) {
  306. $this->plugins = CakePlugin::loaded();
  307. }
  308. if (!empty($this->plugins)) {
  309. foreach ($this->plugins as $plugin) {
  310. $pluginType = $plugin . '.' . $type;
  311. $pluginFiles = App::objects($pluginType, null, false);
  312. if (!empty($pluginFiles)) {
  313. foreach ($pluginFiles as $file) {
  314. if (strpos($file, 'App' . $type) !== false) {
  315. //$this->appFiles[$file] = $plugin.'.'.$type;
  316. continue;
  317. }
  318. $files[] = $file;
  319. }
  320. }
  321. }
  322. }
  323. $files = array_unique($files);
  324. // no test/tmp files etc (helper.test.php or helper.OLD.php)
  325. foreach ($files as $key => $file) {
  326. if (strpos($file, '.') !== false || !preg_match('/^[\da-zA-Z_]+$/', $file)) {
  327. unset($files[$key]);
  328. }
  329. }
  330. return $files;
  331. }
  332. }