<commit_before><?php
/**
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @since         2.5.0
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */
namespace Cake\Console\Command\Task;

use Cake\Console\ConsoleOptionParser;
use Cake\Console\Shell;
use Cake\Core\App;
use Cake\Core\Plugin;
use Cake\Utility\Inflector;
use \ReflectionClass;
use \ReflectionMethod;

/**
 * Base class for Shell Command reflection.
 *
 */
class CommandTask extends Shell {

/**
 * Gets the shell command listing.
 *
 * @return array
 */
	public function getShellList() {
		$skipFiles = ['AppShell'];
		$hiddenCommands = ['CommandListShell', 'CompletionShell'];

		$plugins = Plugin::loaded();
		$shellList = array_fill_keys($plugins, null) + ['CORE' => null, 'app' => null];

		$corePath = App::core('Console/Command');
		$shells = App::objects('file', $corePath[0]);
		$shells = array_diff($shells, $skipFiles, $hiddenCommands);
		$this->_appendShells('CORE', $shells, $shellList);

		$appShells = App::objects('Console/Command', null, false);
		$appShells = array_diff($appShells, $shells, $skipFiles);
		$this->_appendShells('app', $appShells, $shellList);

		foreach ($plugins as $plugin) {
			$pluginShells = App::objects($plugin . '.Console/Command');
			$this->_appendShells($plugin, $pluginShells, $shellList);
		}

		return array_filter($shellList);
	}

/**
 * Scan the provided paths for shells, and append them into $shellList
 *
 * @param string $type The type of object.
 * @param array $shells The shell name.
 * @param array &$shellList List of shells.
 * @return void
 */
	protected function _appendShells($type, $shells, &$shellList) {
		foreach ($shells as $shell) {
			$shellList[$type][] = Inflector::underscore(str_replace('Shell', '', $shell));
		}
	}

/**
 * Return a list of all commands
 *
 * @return array
 */
	public function commands() {
		$shellList = $this->getShellList();

		$options = [];
		foreach ($shellList as $type => $commands) {
			$prefix = '';
			if (!in_array(strtolower($type), ['app', 'core'])) {
				$prefix = $type . '.';
			}

			foreach ($commands as $shell) {
				$options[] = $prefix . $shell;
			}
		}

		return $options;
	}

/**
 * Return a list of subcommands for a given command
 *
 * @param string $commandName The command you want subcommands from.
 * @return array<commit_msg>Don't use App::objects() in command shell tools.<commit_after><?php
/**
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @since         2.5.0
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */
namespace Cake\Console\Command\Task;

use Cake\Console\ConsoleOptionParser;
use Cake\Console\Shell;
use Cake\Core\App;
use Cake\Core\Plugin;
use Cake\Utility\Inflector;
use Cake\Utility\Folder;
use \ReflectionClass;
use \ReflectionMethod;

/**
 * Base class for Shell Command reflection.
 *
 */
class CommandTask extends Shell {

/**
 * Gets the shell command listing.
 *
 * @return array
 */
	public function getShellList() {
		$skipFiles = ['AppShell'];
		$hiddenCommands = ['CommandListShell', 'CompletionShell'];

		$plugins = Plugin::loaded();
		$shellList = array_fill_keys($plugins, null) + ['CORE' => null, 'app' => null];

		$corePath = App::core('Console/Command');
		$shells = $this->_scanDir($corePath[0]);
		$shells = array_diff($shells, $skipFiles, $hiddenCommands);
		$this->_appendShells('CORE', $shells, $shellList);

		$appPath = App::path('Console/Command');
		$appShells = $this->_scanDir($appPath[0]);
		$appShells = array_diff($appShells, $shells, $skipFiles);
		$this->_appendShells('app', $appShells, $shellList);

		foreach ($plugins as $plugin) {
			$pluginPath = Plugin::classPath($plugin) . 'Console' . DS . 'Command';
			$pluginShells = $this->_scanDir($pluginPath);
			$this->_appendShells($plugin, $pluginShells, $shellList);
		}

		return array_filter($shellList);
	}

/**
 * Scan the provided paths for shells, and append them into $shellList
 *
 * @param string $type The type of object.
 * @param array $shells The shell name.
 * @param array &$shellList List of shells.
 * @return void
 */
	protected function _appendShells($type, $shells, &$shellList) {
		foreach ($shells as $shell) {
			$shellList[$type][] = Inflector::underscore(str_replace('Shell', '', $shell));
		}
	}

/**
 * Scan a directory for .php files and return the class names that
 * should be within them.
 *
 * @param string $dir The directory to read.
 * @return array The list of shell classnames based on conventions.
 */
	protected function _scanDir($dir) {
		$dir = new Folder($dir);
		$contents = $dir->read(true, true);
		if (empty($contents[1])) {
			return [];
		}
		$shells = [];
		foreach ($contents[1] as $file) {
			if (substr($file, -4) !== '.php') {
				continue;
			}
			$shells[] = substr($file, 0, -4);
		}
		return $shells;
	}

/**
 * Return a list of all commands
 *
 * @return array
 */
	public function commands() {
		$shellList = $this->getShellList();

		$options = [];
		foreach ($shellList as $type => $commands) {
			$prefix = '';
			if (!in_array(strtolower($type), ['app', 'core'])) {
				$prefix = $type . '.';
			}

			foreach ($commands as $shell) {
				$options[] = $prefix . $shell;
			}
		}

		return $options;
	}

/**
 * Return a list of subcommands for a given command
 *
 * @param string $commandName The command you want subcommands from.
 * @return array
{'fraction_non_alphanumeric': 0.15715892656275107, 'fraction_numerical': 0.0022497187851518562, 'mean_word_length': 3.951471758154336, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4810801', 'n_tokens_mistral': 2104, 'n_tokens_neox': 1940, 'n_words': 549}