Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 7 additions & 12 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,26 +76,21 @@ guidance away from dangerous sets.
->withDocblockLevel(1);
```

Each level applies the same number of rules to your code, safest first:
Example from the array set (`tests/Set/Array/Fixture/nested_array.php.inc`):

```diff
-$values = array(1, 2, 3,);
+$values = [1, 2, 3];
-$test = ['key' => ['keyA' => 'valueA']];
+$test = [
+ 'key' => [
+ 'keyA' => 'valueA',
+ ],
+];
```

### Changed
- Reconfigure `OrderedImportsFixer` to sort imports by `class`, `function`, then `const`,
avoiding a mixed import order (#321)

```diff
use App\Service\SomeService;
-use const PHP_EOL;
use App\Service\AnotherService;
-use function strlen;
+use function strlen;
+use const PHP_EOL;
```

```php
// config/set/clean-code.php
use PhpCsFixer\Fixer\Import\OrderedImportsFixer;
Expand Down
14 changes: 9 additions & 5 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "symplify/easy-coding-standard",
"description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer.",
"description": "The easiest way to use coding standard in a PHP project, runs on PHP 7.2+, prepared sets out of box, step-bystep levels, no-brainer",
"license": "MIT",
"keywords": [
"static analysis",
Expand All @@ -13,33 +13,37 @@
],
"require": {
"php": ">=8.4",
"clue/ndjson-react": "^1.3",
"composer/pcre": "^3.3.2",
"composer/xdebug-handler": "^3.0.5",
"entropy/entropy": "^0.3",
"fidry/cpu-core-counter": "^1.3",
"friendsofphp/php-cs-fixer": "^3.95.5",
"illuminate/container": "12.39.*",
"nette/utils": "^4.1",
"react/child-process": "^0.6.7",
"react/event-loop": "^1.6",
"react/socket": "^1.17",
"sebastian/diff": "^9.0",
"squizlabs/php_codesniffer": "^4.0.1",
"symfony/console": "^6.4.24",
"symfony/finder": "^7.4",
"symplify/coding-standard": "^13.1",
"symplify/easy-parallel": "^11.2",
"webmozart/assert": "^2.4"
},
"require-dev": {
"phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^2.2",
"phpstan/phpstan-phpunit": "^2.0.16",
"phpstan/phpstan-phpunit": "^2.0",
"phpstan/phpstan-webmozart-assert": "^2.0",
"phpunit/phpunit": "^13.0",
"phpunit/phpunit": "^13.2",
"rector/jack": "^1.0",
"rector/rector": "^2.4",
"rector/type-perfect": "^2.1",
"symplify/phpstan-rules": "^14.11",
"symplify/vendor-patches": "^11.5",
"tomasvotruba/class-leak": "^2.1.6",
"tomasvotruba/type-coverage": "^2.1",
"tomasvotruba/type-coverage": "^2.2",
"tomasvotruba/unused-public": "^2.2",
"tracy/tracy": "^2.12"
},
Expand Down
2 changes: 1 addition & 1 deletion phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ parameters:
# set above
-
path: src/Parallel/Application/ParallelFileProcessor.php
message: '#Cannot call method (.*?)\(\) on Symplify\\EasyParallel\\ValueObject\\ProcessPool\|null#'
message: '#Cannot call method (.*?)\(\) on Symplify\\EasyCodingStandard\\Parallel\\ValueObject\\ProcessPool\|null#'

- '#Method Symplify\\EasyCodingStandard\\Console\\Command\\ListCheckersCommand\:\:getObjectClasses\(\) should return (.*?)#'

Expand Down
4 changes: 2 additions & 2 deletions src/Application/EasyCodingStandardApplication.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@
use Symplify\EasyCodingStandard\FileSystem\StaticRelativeFilePathHelper;
use Symplify\EasyCodingStandard\Finder\SourceFinder;
use Symplify\EasyCodingStandard\Parallel\Application\ParallelFileProcessor;
use Symplify\EasyCodingStandard\Parallel\CpuCoreCountProvider;
use Symplify\EasyCodingStandard\Parallel\ScheduleFactory;
use Symplify\EasyCodingStandard\Parallel\ValueObject\Bridge;
use Symplify\EasyCodingStandard\SniffRunner\ValueObject\Error\CodingStandardError;
use Symplify\EasyCodingStandard\Utils\ParametersMerger;
use Symplify\EasyCodingStandard\ValueObject\Configuration;
use Symplify\EasyCodingStandard\ValueObject\Error\FileDiff;
use Symplify\EasyCodingStandard\ValueObject\Error\SystemError;
use Symplify\EasyCodingStandard\ValueObject\Option;
use Symplify\EasyParallel\CpuCoreCountProvider;
use Symplify\EasyParallel\ScheduleFactory;

final readonly class EasyCodingStandardApplication
{
Expand Down
4 changes: 2 additions & 2 deletions src/Console/Command/WorkerCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
use Symfony\Component\Console\Output\OutputInterface;
use Symplify\EasyCodingStandard\Configuration\ConfigurationFactory;
use Symplify\EasyCodingStandard\MemoryLimitter;
use Symplify\EasyCodingStandard\Parallel\Enum\Action;
use Symplify\EasyCodingStandard\Parallel\Enum\ReactCommand;
use Symplify\EasyCodingStandard\Parallel\WorkerRunner;
use Symplify\EasyParallel\Enum\Action;
use Symplify\EasyParallel\Enum\ReactCommand;

/**
* Inspired at: https://github.com/phpstan/phpstan-src/commit/9124c66dcc55a222e21b1717ba5f60771f7dda92
Expand Down
16 changes: 8 additions & 8 deletions src/Parallel/Application/ParallelFileProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,19 @@
use Symfony\Component\Console\Input\InputInterface;
use Symplify\EasyCodingStandard\Console\Command\CheckCommand;
use Symplify\EasyCodingStandard\DependencyInjection\SimpleParameterProvider;
use Symplify\EasyCodingStandard\Parallel\CommandLine\WorkerCommandLineFactory;
use Symplify\EasyCodingStandard\Parallel\Enum\Action;
use Symplify\EasyCodingStandard\Parallel\Enum\Content;
use Symplify\EasyCodingStandard\Parallel\Enum\ReactCommand;
use Symplify\EasyCodingStandard\Parallel\Enum\ReactEvent;
use Symplify\EasyCodingStandard\Parallel\ValueObject\Bridge;
use Symplify\EasyCodingStandard\Parallel\ValueObject\ParallelProcess;
use Symplify\EasyCodingStandard\Parallel\ValueObject\ProcessPool;
use Symplify\EasyCodingStandard\Parallel\ValueObject\Schedule;
use Symplify\EasyCodingStandard\SniffRunner\ValueObject\Error\CodingStandardError;
use Symplify\EasyCodingStandard\ValueObject\Error\FileDiff;
use Symplify\EasyCodingStandard\ValueObject\Error\SystemError;
use Symplify\EasyCodingStandard\ValueObject\Option;
use Symplify\EasyParallel\CommandLine\WorkerCommandLineFactory;
use Symplify\EasyParallel\Enum\Action;
use Symplify\EasyParallel\Enum\Content;
use Symplify\EasyParallel\Enum\ReactCommand;
use Symplify\EasyParallel\Enum\ReactEvent;
use Symplify\EasyParallel\ValueObject\ParallelProcess;
use Symplify\EasyParallel\ValueObject\ProcessPool;
use Symplify\EasyParallel\ValueObject\Schedule;
use Throwable;

/**
Expand Down
169 changes: 169 additions & 0 deletions src/Parallel/CommandLine/WorkerCommandLineFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
<?php

declare(strict_types=1);

namespace Symplify\EasyCodingStandard\Parallel\CommandLine;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symplify\EasyCodingStandard\Parallel\Exception\ParallelShouldNotHappenException;
use Symplify\EasyCodingStandard\Parallel\Reflection\CommandFromReflectionFactory;

/**
* @api
*/
final class WorkerCommandLineFactory
{
private const string OPTION_DASHES = '--';

/**
* These options are not relevant for nested worker command line.
*
* @var string[]
*/
private const array EXCLUDED_OPTION_NAMES = ['output-format'];

private readonly CommandFromReflectionFactory $commandFromReflectionFactory;

public function __construct()
{
$this->commandFromReflectionFactory = new CommandFromReflectionFactory();
}

/**
* @param class-string<Command> $mainCommandClass
*/
public function create(
string $baseScript,
string $mainCommandClass,
string $workerCommandName,
string $pathsOptionName,
?string $projectConfigFile,
InputInterface $input,
string $identifier,
int $port
): string {
$commandArguments = array_slice($_SERVER['argv'], 1);
$args = array_merge([PHP_BINARY, $baseScript], $commandArguments);

$mainCommand = $this->commandFromReflectionFactory->create($mainCommandClass);

if ($mainCommand->getName() === null) {
$errorMessage = sprintf('The command name for "%s" is missing', $mainCommand::class);
throw new ParallelShouldNotHappenException($errorMessage);
}

$mainCommandName = $mainCommand->getName();

$processCommandArray = [];

foreach ($args as $arg) {
// skip command name
if ($arg === $mainCommandName) {
break;
}

$processCommandArray[] = escapeshellarg((string) $arg);
}

$processCommandArray[] = $workerCommandName;
if ($projectConfigFile !== null) {
$processCommandArray[] = '--config';
$processCommandArray[] = escapeshellarg($projectConfigFile);
}

$mainCommandOptionNames = $this->getCommandOptionNames($mainCommand);
$processCommandOptions = $this->mirrorCommandOptions($input, $mainCommandOptionNames);
$processCommandArray = array_merge($processCommandArray, $processCommandOptions);

// for TCP local server
$processCommandArray[] = '--port';
$processCommandArray[] = $port;

$processCommandArray[] = '--identifier';
$processCommandArray[] = escapeshellarg($identifier);

/** @var string[] $paths */
$paths = (array) $input->getArgument($pathsOptionName);
foreach ($paths as $path) {
$processCommandArray[] = escapeshellarg($path);
}

// set json output
$processCommandArray[] = '--output-format';
$processCommandArray[] = escapeshellarg('json');

// explicitly disable colors, breaks json_decode() otherwise
// @see https://github.com/symfony/symfony/issues/1238
$processCommandArray[] = '--no-ansi';

return implode(' ', $processCommandArray);
}

/**
* @return string[]
*/
private function getCommandOptionNames(Command $command): array
{
$inputDefinition = $command->getDefinition();

$optionNames = [];
foreach ($inputDefinition->getOptions() as $inputOption) {
$optionNames[] = $inputOption->getName();
}

return $optionNames;
}

/**
* Keeps all options that are allowed in check command options
*
* @param string[] $mainCommandOptionNames
* @return string[]
*/
private function mirrorCommandOptions(InputInterface $input, array $mainCommandOptionNames): array
{
$processCommandOptions = [];

foreach ($mainCommandOptionNames as $mainCommandOptionName) {
if ($this->shouldSkipOption($input, $mainCommandOptionName)) {
continue;
}

/** @var bool|string|null $optionValue */
$optionValue = $input->getOption($mainCommandOptionName);

// skip clutter
if ($optionValue === null) {
continue;
}

if (is_bool($optionValue)) {
if ($optionValue) {
$processCommandOptions[] = self::OPTION_DASHES . $mainCommandOptionName;
}

continue;
}

if ($mainCommandOptionName === 'memory-limit') {
// symfony/console does not accept -1 as value without assign
$processCommandOptions[] = '--' . $mainCommandOptionName . '=' . $optionValue;
} else {
$processCommandOptions[] = self::OPTION_DASHES . $mainCommandOptionName;
$processCommandOptions[] = escapeshellarg($optionValue);
}
}

return $processCommandOptions;
}

private function shouldSkipOption(InputInterface $input, string $optionName): bool
{
if (! $input->hasOption($optionName)) {
return true;
}

return in_array($optionName, self::EXCLUDED_OPTION_NAMES, true);
}
}
18 changes: 18 additions & 0 deletions src/Parallel/Contract/SerializableInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace Symplify\EasyCodingStandard\Parallel\Contract;

use JsonSerializable;

/**
* @api
*/
interface SerializableInterface extends JsonSerializable
{
/**
* @param array<string, mixed> $json
*/
public static function decode(array $json): self;
}
25 changes: 25 additions & 0 deletions src/Parallel/CpuCoreCountProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

declare(strict_types=1);

namespace Symplify\EasyCodingStandard\Parallel;

use Fidry\CpuCoreCounter\CpuCoreCounter;
use Fidry\CpuCoreCounter\NumberOfCpuCoreNotFound;

/**
* @api
*/
final class CpuCoreCountProvider
{
private const int DEFAULT_CORE_COUNT = 2;

public function provide(): int
{
try {
return (new CpuCoreCounter())->getCount();
} catch (NumberOfCpuCoreNotFound) {
return self::DEFAULT_CORE_COUNT;
}
}
}
17 changes: 17 additions & 0 deletions src/Parallel/Enum/Action.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

declare(strict_types=1);

namespace Symplify\EasyCodingStandard\Parallel\Enum;

/**
* @enum
*/
final class Action
{
public const string HELLO = 'hello';

public const string MAIN = 'main';

public const string RESULT = 'result';
}
15 changes: 15 additions & 0 deletions src/Parallel/Enum/Content.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace Symplify\EasyCodingStandard\Parallel\Enum;

/**
* @enum
*/
final class Content
{
public const string RESULT = 'result';

public const string FILES = 'files';
}
Loading
Loading