Skip to content

Commit

Permalink
Merge pull request #8110 from kenjis/feat-spark-config-check
Browse files Browse the repository at this point in the history
feat: add `config:check` command to check Config vaules
  • Loading branch information
kenjis authored Nov 3, 2023
2 parents bfa6137 + 7374b58 commit 4e57cee
Show file tree
Hide file tree
Showing 4 changed files with 402 additions and 0 deletions.
140 changes: 140 additions & 0 deletions system/Commands/Utilities/ConfigCheck.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
<?php

/**
* This file is part of CodeIgniter 4 framework.
*
* (c) CodeIgniter Foundation <[email protected]>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/

namespace CodeIgniter\Commands\Utilities;

use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
use CodeIgniter\Config\BaseConfig;
use Kint\Kint;

/**
* Check the Config values.
*
* @see \CodeIgniter\Commands\Utilities\ConfigCheckTest
*/
final class ConfigCheck extends BaseCommand
{
/**
* The group the command is lumped under
* when listing commands.
*
* @var string
*/
protected $group = 'CodeIgniter';

/**
* The Command's name
*
* @var string
*/
protected $name = 'config:check';

/**
* The Command's short description
*
* @var string
*/
protected $description = 'Check your Config values.';

/**
* The Command's usage
*
* @var string
*/
protected $usage = 'config:check <classname>';

/**
* The Command's arguments
*
* @var array<string, string>
*/
protected $arguments = [
'classname' => 'The config classname to check. Short classname or FQCN.',
];

/**
* The Command's options
*
* @var array<string, string>
*/
protected $options = [];

/**
* {@inheritDoc}
*/
public function run(array $params)
{
if (! isset($params[0])) {
CLI::error('You must specify a Config classname.');
CLI::write(' Usage: ' . $this->usage);
CLI::write('Example: config:check App');
CLI::write(' config:check \'CodeIgniter\Shield\Config\Auth\'');

return EXIT_ERROR;
}

/** @var class-string<BaseConfig> $class */
$class = $params[0];

$config = config($class);

if ($config === null) {
CLI::error('No such Config class: ' . $class);

return EXIT_ERROR;
}

if (defined('KINT_DIR') && Kint::$enabled_mode !== false) {
CLI::write($this->getKintD($config));
} else {
CLI::write(
CLI::color($this->getVarDump($config), 'cyan')
);
}

return EXIT_SUCCESS;
}

/**
* Gets object dump by Kint d()
*/
private function getKintD(object $config): string
{
ob_start();
d($config);
$output = ob_get_clean();

$output = trim($output);

$lines = explode("\n", $output);
array_splice($lines, 0, 3);
array_splice($lines, -3);

return implode("\n", $lines);
}

/**
* Gets object dump by var_dump()
*/
private function getVarDump(object $config): string
{
ob_start();
var_dump($config);
$output = ob_get_clean();

return preg_replace(
'!.*system/Commands/Utilities/ConfigCheck.php.*\n!u',
'',
$output
);
}
}
212 changes: 212 additions & 0 deletions tests/system/Commands/Utilities/ConfigCheckTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
<?php

/**
* This file is part of CodeIgniter 4 framework.
*
* (c) CodeIgniter Foundation <[email protected]>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/

namespace CodeIgniter\Commands\Utilities;

use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\StreamFilterTrait;
use Config\App;
use Config\Services;

/**
* @internal
*
* @group Others
*/
final class ConfigCheckTest extends CIUnitTestCase
{
use StreamFilterTrait;

protected function setUp(): void
{
$this->resetServices();
parent::setUp();
}

protected function tearDown(): void
{
$this->resetServices();
parent::tearDown();
}

protected function getBuffer()
{
return $this->getStreamFilterBuffer();
}

public function testCommandConfigCheckNoArg(): void
{
command('config:check');

$this->assertStringContainsString(
'You must specify a Config classname.',
$this->getBuffer()
);
}

public function testCommandConfigCheckApp(): void
{
command('config:check App');

$this->assertStringContainsString(App::class, $this->getBuffer());
$this->assertStringContainsString("public 'baseURL", $this->getBuffer());
}

public function testCommandConfigCheckNonexistentClass(): void
{
command('config:check Nonexistent');

$this->assertStringContainsString(
'No such Config class: Nonexistent',
$this->getBuffer()
);
}

public function testGetKintD()
{
$command = new ConfigCheck(Services::logger(), Services::commands());
$getKintD = $this->getPrivateMethodInvoker($command, 'getKintD');

$output = $getKintD(new App());

$output = preg_replace(
'/(\033\[[0-9;]+m)|(\035\[[0-9;]+m)/u',
'',
$output
);

$this->assertStringContainsString(
'Config\App#',
$output
);
$this->assertStringContainsString(
<<<'EOL'
(
public 'baseURL' -> string (19) "http://example.com/"
public 'allowedHostnames' -> array (0) []
public 'indexPage' -> string (9) "index.php"
public 'uriProtocol' -> string (11) "REQUEST_URI"
public 'defaultLocale' -> string (2) "en"
public 'negotiateLocale' -> boolean false
public 'supportedLocales' -> array (1) [
0 => string (2) "en"
]
public 'appTimezone' -> string (3) "UTC"
public 'charset' -> string (5) "UTF-8"
public 'forceGlobalSecureRequests' -> boolean false
public 'proxyIPs' -> array (0) []
public 'CSPEnabled' -> boolean false
EOL,
$output
);
}

public function testGetVarDump()
{
$command = new ConfigCheck(Services::logger(), Services::commands());
$getVarDump = $this->getPrivateMethodInvoker($command, 'getVarDump');

$output = $getVarDump(new App());

if (
ini_get('xdebug.mode')
&& in_array(
'develop',
explode(',', ini_get('xdebug.mode')),
true
)
) {
// Xdebug overloads var_dump().
$this->assertStringContainsString(
'class Config\App#',
$output
);
$this->assertStringContainsString(
<<<'EOL'
{
public string $baseURL =>
string(19) "http://example.com/"
public array $allowedHostnames =>
array(0) {
}
public string $indexPage =>
string(9) "index.php"
public string $uriProtocol =>
string(11) "REQUEST_URI"
public string $defaultLocale =>
string(2) "en"
public bool $negotiateLocale =>
bool(false)
public array $supportedLocales =>
array(1) {
[0] =>
string(2) "en"
}
public string $appTimezone =>
string(3) "UTC"
public string $charset =>
string(5) "UTF-8"
public bool $forceGlobalSecureRequests =>
bool(false)
public array $proxyIPs =>
array(0) {
}
public bool $CSPEnabled =>
bool(false)
}
EOL,
$output
);
} else {
// PHP's var_dump().
$this->assertStringContainsString(
'object(Config\App)#',
$output
);
$this->assertStringContainsString(
<<<'EOL'
{
["baseURL"]=>
string(19) "http://example.com/"
["allowedHostnames"]=>
array(0) {
}
["indexPage"]=>
string(9) "index.php"
["uriProtocol"]=>
string(11) "REQUEST_URI"
["defaultLocale"]=>
string(2) "en"
["negotiateLocale"]=>
bool(false)
["supportedLocales"]=>
array(1) {
[0]=>
string(2) "en"
}
["appTimezone"]=>
string(3) "UTC"
["charset"]=>
string(5) "UTF-8"
["forceGlobalSecureRequests"]=>
bool(false)
["proxyIPs"]=>
array(0) {
}
["CSPEnabled"]=>
bool(false)
}
EOL,
$output
);
}
}
}
2 changes: 2 additions & 0 deletions user_guide_src/source/changelogs/v4.5.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,8 @@ Enhancements
Commands
========

- Added ``spark config:check`` command to check Config values. See
:ref:`confirming-config-values` for the details.
- Added ``spark lang:find`` command to update translations keys. See :ref:`generating-translation-files-via-command` for the details.

Testing
Expand Down
Loading

0 comments on commit 4e57cee

Please sign in to comment.