Initial commit
This commit is contained in:
commit
a6b66b9b01
|
@ -0,0 +1,3 @@
|
||||||
|
.gitattributes export-ignore
|
||||||
|
.gitignore export-ignore
|
||||||
|
test/ export-ignore
|
|
@ -0,0 +1,4 @@
|
||||||
|
composer.lock
|
||||||
|
.idea/
|
||||||
|
log/
|
||||||
|
vendor/
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2013-2019 TechFuze
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -0,0 +1,60 @@
|
||||||
|
FuzeWorks CLI Component - Readme
|
||||||
|
===================
|
||||||
|
|
||||||
|
Version 1.3.0
|
||||||
|
|
||||||
|
A versatile PHP Framework built to perform.
|
||||||
|
|
||||||
|
https://i15.nl/fuzeworks
|
||||||
|
|
||||||
|
Summary
|
||||||
|
-------
|
||||||
|
|
||||||
|
FuzeWorks is a flexible PHP Framework made for the requirements of today's web.
|
||||||
|
For a summary of features, list of requirements, and installation instructions,
|
||||||
|
please see the documentation in the ./doc/ folder or at http://i15.nl/fuzeworks
|
||||||
|
|
||||||
|
Copyright
|
||||||
|
---------
|
||||||
|
|
||||||
|
Copyright © 2013 onwards -- i15
|
||||||
|
|
||||||
|
Certain libraries are copyrighted by their respective authors;
|
||||||
|
see the full copyright list for details.
|
||||||
|
|
||||||
|
For full copyright information, please see ./doc/copyright.html
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
Licensing of current contributions
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Beginning on 2018-04-17, new contributions to this codebase are all licensed
|
||||||
|
under terms compatible with the MIT license. FuzeWorks is currently
|
||||||
|
transitioning older code to the MIT License, but work is not yet complete.
|
||||||
|
|
||||||
|
Enjoy!
|
||||||
|
------
|
||||||
|
|
||||||
|
i15
|
|
@ -0,0 +1,94 @@
|
||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* FuzeWorks CLIComponent
|
||||||
|
*
|
||||||
|
* The FuzeWorks PHP FrameWork
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013-2021 i15
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author i15
|
||||||
|
* @copyright Copyright (c) 2013 - 2021, i15. (https://i15.nl)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
*
|
||||||
|
* @since Version 1.2.0
|
||||||
|
*
|
||||||
|
* @version Version 1.2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
use FuzeWorks\Exception\InvalidArgumentException;
|
||||||
|
use FuzeWorks\Factory;
|
||||||
|
|
||||||
|
// First perform a PHP version check
|
||||||
|
if (version_compare('7.4.0', PHP_VERSION, '>')) {
|
||||||
|
fwrite(
|
||||||
|
STDERR,
|
||||||
|
sprintf(
|
||||||
|
'FuzeWorks Async requires PHP 7.4 or higher.' . PHP_EOL .
|
||||||
|
'You are using PHP %s (%s).' . PHP_EOL,
|
||||||
|
PHP_VERSION,
|
||||||
|
PHP_BINARY
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
die(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// First load composer
|
||||||
|
$autoloaders = [
|
||||||
|
__DIR__ . '/../../autoload.php',
|
||||||
|
__DIR__ . '/../vendor/autoload.php',
|
||||||
|
__DIR__ . '/vendor/autoload.php'
|
||||||
|
];
|
||||||
|
foreach ($autoloaders as $file)
|
||||||
|
if (file_exists($file))
|
||||||
|
require_once($file);
|
||||||
|
|
||||||
|
// If a bootstrap is provided, use that one
|
||||||
|
$arguments = getopt('', ['bootstrap:']);
|
||||||
|
if (!isset($arguments['bootstrap']) || empty($arguments['bootstrap']))
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Could not load supervisor. No bootstrap provided.\n");
|
||||||
|
die(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the file. If it doesn't exist, fail.
|
||||||
|
$bootstrap = $arguments['bootstrap'];
|
||||||
|
if (!file_exists($bootstrap))
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Could not load supervisor. Provided bootstrap doesn't exist.");
|
||||||
|
die(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the bootstrap
|
||||||
|
/** @var Factory $container */
|
||||||
|
$container = require($bootstrap);
|
||||||
|
|
||||||
|
// Check if container is a Factory
|
||||||
|
if (!$container instanceof Factory)
|
||||||
|
{
|
||||||
|
fwrite(STDERR, "Could not load supervisor. Provided bootstrap is not a valid bootstrap.");
|
||||||
|
die(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var CLIComponent $cli */
|
||||||
|
$cli = $container->cli;
|
||||||
|
$cli->routeCliRequest();
|
|
@ -0,0 +1,30 @@
|
||||||
|
{
|
||||||
|
"name": "fuzeworks/clicomponent",
|
||||||
|
"description": "FuzeWorks CLI Component",
|
||||||
|
"license": ["MIT"],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "TechFuze",
|
||||||
|
"homepage": "https://techfuze.net"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FuzeWorks Community",
|
||||||
|
"homepage": "https://techfuze.net/fuzeworks/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.4.0",
|
||||||
|
"fuzeworks/mvcr": "~1.3.1",
|
||||||
|
"fuzeworks/core": "~1.2.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^9",
|
||||||
|
"fuzeworks/tracycomponent": "~1.2.0"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"FuzeWorks\\": "src/FuzeWorks/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bin": ["bin/fuzeworks"]
|
||||||
|
}
|
|
@ -0,0 +1,156 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* FuzeWorks CLIComponent
|
||||||
|
*
|
||||||
|
* The FuzeWorks PHP FrameWork
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013-2021 i15
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author i15
|
||||||
|
* @copyright Copyright (c) 2013 - 2021, i15. (https://i15.nl)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
*
|
||||||
|
* @since Version 1.2.0
|
||||||
|
*
|
||||||
|
* @version Version 1.2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FuzeWorks\CLI;
|
||||||
|
use FuzeWorks\CLI\Exception\CLIException;
|
||||||
|
use FuzeWorks\Configurator;
|
||||||
|
use FuzeWorks\Controllers;
|
||||||
|
use FuzeWorks\Events;
|
||||||
|
use FuzeWorks\Exception\FactoryException;
|
||||||
|
use FuzeWorks\Factory;
|
||||||
|
use FuzeWorks\iComponent;
|
||||||
|
use FuzeWorks\Logger;
|
||||||
|
use FuzeWorks\Models;
|
||||||
|
use FuzeWorks\MVCRComponent;
|
||||||
|
use FuzeWorks\Priority;
|
||||||
|
use FuzeWorks\Router;
|
||||||
|
use FuzeWorks\Views;
|
||||||
|
|
||||||
|
class CLIComponent implements iComponent
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether CLIComponent is configured to handle a CLI request
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public static bool $willHandleRequest = false;
|
||||||
|
|
||||||
|
public function getName(): string
|
||||||
|
{
|
||||||
|
return 'CLIComponent';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getClasses(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'cli' => $this,
|
||||||
|
'cliInput' => '\FuzeWorks\CLI\Input',
|
||||||
|
'cliOutput' => '\FuzeWorks\CLI\Output'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onAddComponent(Configurator $configurator)
|
||||||
|
{
|
||||||
|
// Add dependencies
|
||||||
|
$configurator->addComponent(new MVCRComponent());
|
||||||
|
|
||||||
|
// Add fallback configuration directory
|
||||||
|
$configurator->addDirectory(
|
||||||
|
dirname(__DIR__) . DIRECTORY_SEPARATOR . 'Config',
|
||||||
|
'config',
|
||||||
|
Priority::LOWEST
|
||||||
|
);
|
||||||
|
|
||||||
|
// If the component will handle a request, set the logger to output for CLI
|
||||||
|
if (self::$willHandleRequest)
|
||||||
|
$configurator->call('logger', 'setLoggerTemplate', null, 'logger_cli');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onCreateContainer(Factory $container)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function enableComponent()
|
||||||
|
{
|
||||||
|
self::$willHandleRequest = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function disableComponent()
|
||||||
|
{
|
||||||
|
self::$willHandleRequest = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int $logCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
* @throws CLIException
|
||||||
|
* @throws FactoryException
|
||||||
|
*/
|
||||||
|
public function routeCliRequest(): bool
|
||||||
|
{
|
||||||
|
if (!self::$willHandleRequest)
|
||||||
|
throw new CLIException("Could not route CLI request. CLIComponent is not configured to handle requests.");
|
||||||
|
|
||||||
|
// Load dependencies
|
||||||
|
/** @var Router $router */
|
||||||
|
/** @var Input $input */
|
||||||
|
/** @var Models $models */
|
||||||
|
/** @var Views $views */
|
||||||
|
/** @var Controllers $controllers */
|
||||||
|
$input = Factory::getInstance('cliInput');
|
||||||
|
$models = Factory::getInstance('models');
|
||||||
|
$views = Factory::getInstance('views');
|
||||||
|
$controllers = Factory::getInstance('controllers');
|
||||||
|
|
||||||
|
// Add the directories for Models, Views, Controllers from this Component
|
||||||
|
$srcPath = dirname(__DIR__, 2);
|
||||||
|
$models->addComponentPath($srcPath . DS . 'Models'. Priority::LOW);
|
||||||
|
$views->addComponentPath($srcPath . DS . 'Views', Priority::LOW);
|
||||||
|
$controllers->addComponentPath($srcPath . DS . 'Controllers', Priority::LOW);
|
||||||
|
|
||||||
|
// Load the commandProcessor
|
||||||
|
$processor = new CommandProcessor();
|
||||||
|
Events::addListener([$processor, 'routerCallViewEventListener'], 'routerCallViewEvent', Priority::HIGHEST);
|
||||||
|
|
||||||
|
// Start logging the request
|
||||||
|
Logger::newLevel("Routing CLI request...");
|
||||||
|
|
||||||
|
// Fetch input options
|
||||||
|
$arguments = $input->arguments();
|
||||||
|
|
||||||
|
// Prepare commandString and execute
|
||||||
|
array_shift($arguments);
|
||||||
|
$commandString = implode(' ', $arguments);
|
||||||
|
$processor->executeCommand($commandString);
|
||||||
|
|
||||||
|
// And stop logging the request
|
||||||
|
Logger::stopLevel();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* FuzeWorks CLIComponent
|
||||||
|
*
|
||||||
|
* The FuzeWorks PHP FrameWork
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013-2021 i15
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author i15
|
||||||
|
* @copyright Copyright (c) 2013 - 2021, i15. (https://i15.nl)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
*
|
||||||
|
* @since Version 1.2.0
|
||||||
|
*
|
||||||
|
* @version Version 1.2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FuzeWorks\CLI;
|
||||||
|
use FuzeWorks\Factory;
|
||||||
|
use FuzeWorks\View;
|
||||||
|
|
||||||
|
abstract class CLIView extends View
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Input
|
||||||
|
*/
|
||||||
|
protected Input $input;
|
||||||
|
|
||||||
|
protected Output $output;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
$this->input = Factory::getInstance('cliInput');
|
||||||
|
$this->output = Factory::getInstance('cliOutput');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,212 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* FuzeWorks CLIComponent
|
||||||
|
*
|
||||||
|
* The FuzeWorks PHP FrameWork
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013-2021 i15
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author i15
|
||||||
|
* @copyright Copyright (c) 2013 - 2021, i15. (https://i15.nl)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
*
|
||||||
|
* @since Version 1.2.0
|
||||||
|
*
|
||||||
|
* @version Version 1.2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FuzeWorks\CLI;
|
||||||
|
|
||||||
|
use FuzeWorks\Event\RouterCallViewEvent;
|
||||||
|
use FuzeWorks\Events;
|
||||||
|
use FuzeWorks\Exception\HaltException;
|
||||||
|
use FuzeWorks\Exception\NotFoundException;
|
||||||
|
use FuzeWorks\Exception\RouterException;
|
||||||
|
use FuzeWorks\Factory;
|
||||||
|
use FuzeWorks\Logger;
|
||||||
|
use FuzeWorks\Priority;
|
||||||
|
use FuzeWorks\Router;
|
||||||
|
|
||||||
|
class CommandProcessor
|
||||||
|
{
|
||||||
|
|
||||||
|
protected Router $router;
|
||||||
|
protected Output $output;
|
||||||
|
protected array $options;
|
||||||
|
|
||||||
|
public function routerCallViewEventListener(RouterCallViewEvent $event)
|
||||||
|
{
|
||||||
|
// If this is related to CLI, add the options as a parameter
|
||||||
|
if ($event->view instanceof CLIView)
|
||||||
|
$event->addParameter($this->options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes a command in the CLI environment.
|
||||||
|
*
|
||||||
|
* Returns true on successful processing. Returns false on failure
|
||||||
|
*
|
||||||
|
* @param string $commandString
|
||||||
|
*/
|
||||||
|
public function executeCommand(string $commandString): void
|
||||||
|
{
|
||||||
|
/** @var Router $router */
|
||||||
|
/** @var Output $output */
|
||||||
|
$this->router = Factory::getInstance('router');
|
||||||
|
$this->output = Factory::getInstance('cliOutput');
|
||||||
|
|
||||||
|
// Pre-process the command
|
||||||
|
$commandString = $this->preProcess($commandString);
|
||||||
|
|
||||||
|
// First test if the command is empty. If it is, cancel execution
|
||||||
|
if (empty($commandString)) {
|
||||||
|
$this->output->warningOut("No command provided!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Distill different parts of the command
|
||||||
|
$parts = explode(' ', $commandString);
|
||||||
|
|
||||||
|
// Prepare the logCount for a consolidation of logs later
|
||||||
|
// @todo Find a better way to determine to first log. LogCount is not effective and contains many logs from router
|
||||||
|
// @todo Perhaps using routerCallViewEvent would be useful. Much closer than this early logCount
|
||||||
|
$logCount = count(Logger::$logs);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->router->route(
|
||||||
|
$commandString, [3 =>
|
||||||
|
[
|
||||||
|
'(?P<viewName>.*?)(| (?P<viewMethod>.*?)(| (?P<viewParameters>.*?)))' => ['viewType' => 'cli']
|
||||||
|
]
|
||||||
|
]
|
||||||
|
);
|
||||||
|
} catch (NotFoundException $e) {
|
||||||
|
$this->output->warningOut("Requested command '$parts[0]' was not found.");
|
||||||
|
} catch (RouterException $e) {
|
||||||
|
$this->output->errorOut($e->getMessage());
|
||||||
|
} catch (HaltException $e) {
|
||||||
|
$this->output->errorOut("Requested command '$parts[0]' was denied.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Consolidate logs
|
||||||
|
/** @var array $logs */
|
||||||
|
$logs = array_slice(Logger::$logs, $logCount);
|
||||||
|
|
||||||
|
// And parse them
|
||||||
|
$verbose = isset($this->options['v']) || isset($this->options['verbose']);
|
||||||
|
$this->parseLogs($logs, $verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The callable that is used to pick the correct view and controller
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
* @param array $matches
|
||||||
|
* @param array $routeData
|
||||||
|
* @param string $route
|
||||||
|
*/
|
||||||
|
public function cliCallable(array $matches, array $routeData, string $route)
|
||||||
|
{
|
||||||
|
dump($this->options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Processes a commandString and extracts options from it
|
||||||
|
*
|
||||||
|
* @todo Proper compatiblity with string like '--option "Hello World"'
|
||||||
|
*
|
||||||
|
* @param string $commandString
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function preProcess(string $commandString): string
|
||||||
|
{
|
||||||
|
// Split up the command into parts
|
||||||
|
$parts = explode(' ', $commandString);
|
||||||
|
|
||||||
|
// Pass over each part and look for special recognized parts, such as options
|
||||||
|
$options = [];
|
||||||
|
$keepParts = [];
|
||||||
|
for ($i=0;$i<count($parts);$i++)
|
||||||
|
{
|
||||||
|
// First test for longOption
|
||||||
|
if (substr($parts[$i], 0, 2) === '--')
|
||||||
|
{
|
||||||
|
$longOptKey = substr($parts[$i], 2);
|
||||||
|
|
||||||
|
// If the longOpt contains an '=' sign, split up the string there and use parts as key and val
|
||||||
|
if (strpos($longOptKey, '=') !== false)
|
||||||
|
{
|
||||||
|
$longEx = explode('=', $longOptKey);
|
||||||
|
$longOptKey = $longEx[0];
|
||||||
|
$longOptVal = $longEx[1];
|
||||||
|
|
||||||
|
$options[$longOptKey] = $longOptVal;
|
||||||
|
} else {
|
||||||
|
$options[$longOptKey] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then test for shortOption
|
||||||
|
elseif (substr($parts[$i], 0, 1) === '-')
|
||||||
|
{
|
||||||
|
$letters = substr($parts[$i], 1);
|
||||||
|
$ops = str_split($letters, 1);
|
||||||
|
foreach ($ops as $letter)
|
||||||
|
$options[$letter] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If neither, add it to the keep list
|
||||||
|
else
|
||||||
|
$keepParts[] = $parts[$i];
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->options = $options;
|
||||||
|
return implode(' ', $keepParts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse all logs from FuzeWorks::logger and output all that have been thrown for this command
|
||||||
|
*
|
||||||
|
* @param array $logs
|
||||||
|
* @param bool $verbose
|
||||||
|
*/
|
||||||
|
protected function parseLogs(array $logs, bool $verbose = false)
|
||||||
|
{
|
||||||
|
foreach ($logs as $log) {
|
||||||
|
switch ($log['type']) {
|
||||||
|
case 'WARNING':
|
||||||
|
$this->output->warningOut($log['message']);
|
||||||
|
break;
|
||||||
|
case 'ERROR':
|
||||||
|
case 'EXCEPTION':
|
||||||
|
$this->output->errorOut($log['message']);
|
||||||
|
break;
|
||||||
|
case 'LEVEL_START':
|
||||||
|
case 'INFO':
|
||||||
|
if ($verbose)
|
||||||
|
$this->output->lineOut('&f[&rINFO&f]&r ' . $log['message']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* FuzeWorks CLIComponent
|
||||||
|
*
|
||||||
|
* The FuzeWorks PHP FrameWork
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013-2021 i15
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author i15
|
||||||
|
* @copyright Copyright (c) 2013 - 2021, i15. (https://i15.nl)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
*
|
||||||
|
* @since Version 1.2.0
|
||||||
|
*
|
||||||
|
* @version Version 1.2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FuzeWorks\CLI\Exception;
|
||||||
|
use FuzeWorks\Exception\Exception;
|
||||||
|
|
||||||
|
class CLIException extends Exception
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,155 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* FuzeWorks CLIComponent
|
||||||
|
*
|
||||||
|
* The FuzeWorks PHP FrameWork
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013-2021 i15
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author i15
|
||||||
|
* @copyright Copyright (c) 2013 - 2021, i15. (https://i15.nl)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
*
|
||||||
|
* @since Version 1.2.0
|
||||||
|
*
|
||||||
|
* @version Version 1.2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FuzeWorks\CLI;
|
||||||
|
|
||||||
|
|
||||||
|
class Input
|
||||||
|
{
|
||||||
|
|
||||||
|
protected array $arguments = [];
|
||||||
|
|
||||||
|
public function init()
|
||||||
|
{
|
||||||
|
// Collect arguments
|
||||||
|
global $argv;
|
||||||
|
$this->arguments = $argv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $shortOpt
|
||||||
|
* @param array $longOpt
|
||||||
|
* @return false|false[]|string[]
|
||||||
|
*/
|
||||||
|
public function option(array $shortOpt = [], array $longOpt = [])
|
||||||
|
{
|
||||||
|
$shortOpt = implode('', $shortOpt);
|
||||||
|
return getopt($shortOpt, $longOpt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function arguments(): array
|
||||||
|
{
|
||||||
|
return $this->arguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function line(): string
|
||||||
|
{
|
||||||
|
return trim(fgets(STDIN));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* @todo Implement multiline input from pipe ('|')
|
||||||
|
*/
|
||||||
|
public function multiLine(): string
|
||||||
|
{
|
||||||
|
$input = '';
|
||||||
|
|
||||||
|
// While an input is coming, keep going until a break is passed
|
||||||
|
while ($line = $this->line())
|
||||||
|
{
|
||||||
|
// If the line does not end with '\', save the input and break the multiline
|
||||||
|
if (substr(rtrim($line), -2, 2) != ' \\')
|
||||||
|
{
|
||||||
|
$input .= $line;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// If the line ends with '\', save the line and ask for the next one;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$input .= substr(rtrim($line), 0 , -1);
|
||||||
|
echo "\r" . ' > ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// And finally output the input
|
||||||
|
return $input;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asks the user a question to which the user responds. Input will be of type multiline
|
||||||
|
*
|
||||||
|
* @param string $question
|
||||||
|
* @param string $response_type
|
||||||
|
* @param bool $optional
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function dialog(string $question, string $response_type, bool $optional = false): string
|
||||||
|
{
|
||||||
|
// First ask the dialog question
|
||||||
|
echo $question . " > ";
|
||||||
|
|
||||||
|
// Retrieve the input using a multiline
|
||||||
|
$input = $this->multiLine();
|
||||||
|
|
||||||
|
// If the input is empty and not optional, ask again
|
||||||
|
if (empty($input) && !$optional)
|
||||||
|
{
|
||||||
|
echo "Input may is not optional!\n";
|
||||||
|
$input = $this->dialog($question, $response_type, $optional);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify whether the input matches the requested type
|
||||||
|
// @todo
|
||||||
|
|
||||||
|
return $input;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can be used for things like pipe. Might need some rework though...
|
||||||
|
* @todo Rework, implement safe_feof()
|
||||||
|
* @see https://www.php.net/manual/en/function.feof.php
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function stdin(): string
|
||||||
|
{
|
||||||
|
$lines = $this->stdinArray();
|
||||||
|
return implode("\n", $lines);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function stdinArray(): array
|
||||||
|
{
|
||||||
|
$lines = [];
|
||||||
|
while(!feof(STDIN))
|
||||||
|
$lines[] = fgets(STDIN);
|
||||||
|
|
||||||
|
return $lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* FuzeWorks CLIComponent
|
||||||
|
*
|
||||||
|
* The FuzeWorks PHP FrameWork
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013-2021 i15
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author i15
|
||||||
|
* @copyright Copyright (c) 2013 - 2021, i15. (https://i15.nl)
|
||||||
|
* @license https://opensource.org/licenses/MIT MIT License
|
||||||
|
*
|
||||||
|
* @since Version 1.2.0
|
||||||
|
*
|
||||||
|
* @version Version 1.2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace FuzeWorks\CLI;
|
||||||
|
|
||||||
|
|
||||||
|
class Output
|
||||||
|
{
|
||||||
|
|
||||||
|
protected array $colors = [
|
||||||
|
'&0' => '0;30',
|
||||||
|
'&1' => '0;34',
|
||||||
|
'&2' => '0;32',
|
||||||
|
'&3' => '0;36',
|
||||||
|
'&4' => '0;31',
|
||||||
|
'&5' => '0;35',
|
||||||
|
'&6' => '0;33',
|
||||||
|
'&7' => '0;37',
|
||||||
|
'&8' => '1;30',
|
||||||
|
'&9' => '1;34',
|
||||||
|
'&a' => '1;32',
|
||||||
|
'&b' => '1;36',
|
||||||
|
'&c' => '1;31',
|
||||||
|
'&d' => '1;35',
|
||||||
|
'&e' => '1;33',
|
||||||
|
'&f' => '1;37',
|
||||||
|
'&r' => '0'
|
||||||
|
];
|
||||||
|
|
||||||
|
public function charsOut(string $output): void
|
||||||
|
{
|
||||||
|
echo $this->parseOutput($output);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function lineOut(string $output): void
|
||||||
|
{
|
||||||
|
echo $this->parseOutput($output) . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function warningOut(string $output): void
|
||||||
|
{
|
||||||
|
$this->lineOut('&4[&eWARNING&4] &e' . $output . '&r');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function errorOut(string $output): void
|
||||||
|
{
|
||||||
|
$this->lineOut('&4[&eERROR&4] &c' . $output . '&r');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function parseOutput(string $output): string
|
||||||
|
{
|
||||||
|
// First parse for colors
|
||||||
|
foreach ($this->colors as $colorKey => $colorVal) {
|
||||||
|
$output = str_replace($colorKey, "\033[" . $colorVal . 'm', $output);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue