Missing dependancies
This commit is contained in:
+82
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* This file is part of PHP CS Fixer.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace PhpCsFixer\Documentation;
|
||||
|
||||
use PhpCsFixer\Fixer\FixerInterface;
|
||||
use PhpCsFixer\Preg;
|
||||
use PhpCsFixer\Utils;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class DocumentationLocator
|
||||
{
|
||||
private string $path;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->path = \dirname(__DIR__, 2).'/doc';
|
||||
}
|
||||
|
||||
public function getFixersDocumentationDirectoryPath(): string
|
||||
{
|
||||
return $this->path.'/rules';
|
||||
}
|
||||
|
||||
public function getFixersDocumentationIndexFilePath(): string
|
||||
{
|
||||
return $this->getFixersDocumentationDirectoryPath().'/index.rst';
|
||||
}
|
||||
|
||||
public function getFixerDocumentationFilePath(FixerInterface $fixer): string
|
||||
{
|
||||
return $this->getFixersDocumentationDirectoryPath().'/'.Preg::replaceCallback(
|
||||
'/^.*\\\\(.+)\\\\(.+)Fixer$/',
|
||||
static function (array $matches): string {
|
||||
return Utils::camelCaseToUnderscore($matches[1]).'/'.Utils::camelCaseToUnderscore($matches[2]);
|
||||
},
|
||||
\get_class($fixer)
|
||||
).'.rst';
|
||||
}
|
||||
|
||||
public function getFixerDocumentationFileRelativePath(FixerInterface $fixer): string
|
||||
{
|
||||
return Preg::replace(
|
||||
'#^'.preg_quote($this->getFixersDocumentationDirectoryPath(), '#').'/#',
|
||||
'',
|
||||
$this->getFixerDocumentationFilePath($fixer)
|
||||
);
|
||||
}
|
||||
|
||||
public function getRuleSetsDocumentationDirectoryPath(): string
|
||||
{
|
||||
return $this->path.'/ruleSets';
|
||||
}
|
||||
|
||||
public function getRuleSetsDocumentationIndexFilePath(): string
|
||||
{
|
||||
return $this->getRuleSetsDocumentationDirectoryPath().'/index.rst';
|
||||
}
|
||||
|
||||
public function getRuleSetsDocumentationFilePath(string $name): string
|
||||
{
|
||||
return $this->getRuleSetsDocumentationDirectoryPath().'/'.str_replace(':risky', 'Risky', ucfirst(substr($name, 1))).'.rst';
|
||||
}
|
||||
|
||||
public function getListingFilePath(): string
|
||||
{
|
||||
return $this->path.'/list.rst';
|
||||
}
|
||||
}
|
||||
+368
@@ -0,0 +1,368 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* This file is part of PHP CS Fixer.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace PhpCsFixer\Documentation;
|
||||
|
||||
use PhpCsFixer\Console\Command\HelpCommand;
|
||||
use PhpCsFixer\Differ\FullDiffer;
|
||||
use PhpCsFixer\Fixer\ConfigurableFixerInterface;
|
||||
use PhpCsFixer\Fixer\DeprecatedFixerInterface;
|
||||
use PhpCsFixer\Fixer\FixerInterface;
|
||||
use PhpCsFixer\FixerConfiguration\AliasedFixerOption;
|
||||
use PhpCsFixer\FixerConfiguration\AllowedValueSubset;
|
||||
use PhpCsFixer\FixerConfiguration\DeprecatedFixerOptionInterface;
|
||||
use PhpCsFixer\FixerDefinition\CodeSampleInterface;
|
||||
use PhpCsFixer\FixerDefinition\FileSpecificCodeSampleInterface;
|
||||
use PhpCsFixer\FixerDefinition\VersionSpecificCodeSampleInterface;
|
||||
use PhpCsFixer\Preg;
|
||||
use PhpCsFixer\RuleSet\RuleSet;
|
||||
use PhpCsFixer\RuleSet\RuleSets;
|
||||
use PhpCsFixer\StdinFileInfo;
|
||||
use PhpCsFixer\Tokenizer\Tokens;
|
||||
use PhpCsFixer\Utils;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class FixerDocumentGenerator
|
||||
{
|
||||
private DocumentationLocator $locator;
|
||||
|
||||
private FullDiffer $differ;
|
||||
|
||||
public function __construct(DocumentationLocator $locator)
|
||||
{
|
||||
$this->locator = $locator;
|
||||
$this->differ = new FullDiffer();
|
||||
}
|
||||
|
||||
public function generateFixerDocumentation(FixerInterface $fixer): string
|
||||
{
|
||||
$name = $fixer->getName();
|
||||
$title = "Rule ``{$name}``";
|
||||
$titleLine = str_repeat('=', \strlen($title));
|
||||
$doc = "{$titleLine}\n{$title}\n{$titleLine}";
|
||||
|
||||
$definition = $fixer->getDefinition();
|
||||
$doc .= "\n\n".RstUtils::toRst($definition->getSummary());
|
||||
|
||||
$description = $definition->getDescription();
|
||||
|
||||
if (null !== $description) {
|
||||
$description = RstUtils::toRst($description);
|
||||
$doc .= <<<RST
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
{$description}
|
||||
RST;
|
||||
}
|
||||
|
||||
$deprecationDescription = '';
|
||||
|
||||
if ($fixer instanceof DeprecatedFixerInterface) {
|
||||
$deprecationDescription = <<<'RST'
|
||||
|
||||
This rule is deprecated and will be removed on next major version
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
RST;
|
||||
$alternatives = $fixer->getSuccessorsNames();
|
||||
|
||||
if (0 !== \count($alternatives)) {
|
||||
$deprecationDescription .= RstUtils::toRst(sprintf(
|
||||
"\n\nYou should use %s instead.",
|
||||
Utils::naturalLanguageJoinWithBackticks($alternatives)
|
||||
), 0);
|
||||
}
|
||||
}
|
||||
|
||||
$riskyDescription = '';
|
||||
$riskyDescriptionRaw = $definition->getRiskyDescription();
|
||||
|
||||
if (null !== $riskyDescriptionRaw) {
|
||||
$riskyDescriptionRaw = RstUtils::toRst($riskyDescriptionRaw, 0);
|
||||
$riskyDescription = <<<RST
|
||||
|
||||
Using this rule is risky
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
{$riskyDescriptionRaw}
|
||||
RST;
|
||||
}
|
||||
|
||||
if ($deprecationDescription || $riskyDescription) {
|
||||
$warningsHeader = 'Warning';
|
||||
|
||||
if ($deprecationDescription && $riskyDescription) {
|
||||
$warningsHeader = 'Warnings';
|
||||
}
|
||||
|
||||
$warningsHeaderLine = str_repeat('-', \strlen($warningsHeader));
|
||||
$doc .= "\n\n".implode("\n", array_filter([
|
||||
$warningsHeader,
|
||||
$warningsHeaderLine,
|
||||
$deprecationDescription,
|
||||
$riskyDescription,
|
||||
]));
|
||||
}
|
||||
|
||||
if ($fixer instanceof ConfigurableFixerInterface) {
|
||||
$doc .= <<<'RST'
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
RST;
|
||||
|
||||
$configurationDefinition = $fixer->getConfigurationDefinition();
|
||||
|
||||
foreach ($configurationDefinition->getOptions() as $option) {
|
||||
$optionInfo = "``{$option->getName()}``";
|
||||
$optionInfo .= "\n".str_repeat('~', \strlen($optionInfo));
|
||||
|
||||
if ($option instanceof DeprecatedFixerOptionInterface) {
|
||||
$deprecationMessage = RstUtils::toRst($option->getDeprecationMessage());
|
||||
$optionInfo .= "\n\n.. warning:: This option is deprecated and will be removed on next major version. {$deprecationMessage}";
|
||||
}
|
||||
|
||||
$optionInfo .= "\n\n".RstUtils::toRst($option->getDescription());
|
||||
|
||||
if ($option instanceof AliasedFixerOption) {
|
||||
$optionInfo .= "\n\n.. note:: The previous name of this option was ``{$option->getAlias()}`` but it is now deprecated and will be removed on next major version.";
|
||||
}
|
||||
|
||||
$allowed = HelpCommand::getDisplayableAllowedValues($option);
|
||||
|
||||
if (null === $allowed) {
|
||||
$allowedKind = 'Allowed types';
|
||||
$allowed = array_map(
|
||||
static fn ($value): string => '``'.$value.'``',
|
||||
$option->getAllowedTypes(),
|
||||
);
|
||||
} else {
|
||||
$allowedKind = 'Allowed values';
|
||||
$allowed = array_map(static function ($value): string {
|
||||
return $value instanceof AllowedValueSubset
|
||||
? 'a subset of ``'.HelpCommand::toString($value->getAllowedValues()).'``'
|
||||
: '``'.HelpCommand::toString($value).'``';
|
||||
}, $allowed);
|
||||
}
|
||||
|
||||
$allowed = implode(', ', $allowed);
|
||||
$optionInfo .= "\n\n{$allowedKind}: {$allowed}";
|
||||
|
||||
if ($option->hasDefault()) {
|
||||
$default = HelpCommand::toString($option->getDefault());
|
||||
$optionInfo .= "\n\nDefault value: ``{$default}``";
|
||||
} else {
|
||||
$optionInfo .= "\n\nThis option is required.";
|
||||
}
|
||||
|
||||
$doc .= "\n\n{$optionInfo}";
|
||||
}
|
||||
}
|
||||
|
||||
$samples = $definition->getCodeSamples();
|
||||
|
||||
if (0 !== \count($samples)) {
|
||||
$doc .= <<<'RST'
|
||||
|
||||
|
||||
Examples
|
||||
--------
|
||||
RST;
|
||||
|
||||
foreach ($samples as $index => $sample) {
|
||||
$title = sprintf('Example #%d', $index + 1);
|
||||
$titleLine = str_repeat('~', \strlen($title));
|
||||
$doc .= "\n\n{$title}\n{$titleLine}";
|
||||
|
||||
if ($fixer instanceof ConfigurableFixerInterface) {
|
||||
if (null === $sample->getConfiguration()) {
|
||||
$doc .= "\n\n*Default* configuration.";
|
||||
} else {
|
||||
$doc .= sprintf(
|
||||
"\n\nWith configuration: ``%s``.",
|
||||
HelpCommand::toString($sample->getConfiguration())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$doc .= "\n".$this->generateSampleDiff($fixer, $sample, $index + 1, $name);
|
||||
}
|
||||
}
|
||||
|
||||
$ruleSetConfigs = [];
|
||||
|
||||
foreach (RuleSets::getSetDefinitionNames() as $set) {
|
||||
$ruleSet = new RuleSet([$set => true]);
|
||||
|
||||
if ($ruleSet->hasRule($name)) {
|
||||
$ruleSetConfigs[$set] = $ruleSet->getRuleConfiguration($name);
|
||||
}
|
||||
}
|
||||
|
||||
if ([] !== $ruleSetConfigs) {
|
||||
$plural = 1 !== \count($ruleSetConfigs) ? 's' : '';
|
||||
$doc .= <<<RST
|
||||
|
||||
|
||||
Rule sets
|
||||
---------
|
||||
|
||||
The rule is part of the following rule set{$plural}:
|
||||
RST;
|
||||
|
||||
foreach ($ruleSetConfigs as $set => $config) {
|
||||
$ruleSetPath = $this->locator->getRuleSetsDocumentationFilePath($set);
|
||||
$ruleSetPath = substr($ruleSetPath, strrpos($ruleSetPath, '/'));
|
||||
|
||||
$doc .= <<<RST
|
||||
|
||||
|
||||
{$set}
|
||||
Using the `{$set} <./../../ruleSets{$ruleSetPath}>`_ rule set will enable the ``{$name}`` rule
|
||||
RST;
|
||||
|
||||
if (null !== $config) {
|
||||
$doc .= " with the config below:\n\n ``".HelpCommand::toString($config).'``';
|
||||
} elseif ($fixer instanceof ConfigurableFixerInterface) {
|
||||
$doc .= ' with the default config.';
|
||||
} else {
|
||||
$doc .= '.';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return "{$doc}\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param FixerInterface[] $fixers
|
||||
*/
|
||||
public function generateFixersDocumentationIndex(array $fixers): string
|
||||
{
|
||||
$overrideGroups = [
|
||||
'PhpUnit' => 'PHPUnit',
|
||||
'PhpTag' => 'PHP Tag',
|
||||
'Phpdoc' => 'PHPDoc',
|
||||
];
|
||||
|
||||
usort($fixers, static function (FixerInterface $a, FixerInterface $b): int {
|
||||
return strcmp(\get_class($a), \get_class($b));
|
||||
});
|
||||
|
||||
$documentation = <<<'RST'
|
||||
=======================
|
||||
List of Available Rules
|
||||
=======================
|
||||
RST;
|
||||
|
||||
$currentGroup = null;
|
||||
|
||||
foreach ($fixers as $fixer) {
|
||||
$namespace = Preg::replace('/^.*\\\\(.+)\\\\.+Fixer$/', '$1', \get_class($fixer));
|
||||
$group = $overrideGroups[$namespace] ?? Preg::replace('/(?<=[[:lower:]])(?=[[:upper:]])/', ' ', $namespace);
|
||||
|
||||
if ($group !== $currentGroup) {
|
||||
$underline = str_repeat('-', \strlen($group));
|
||||
$documentation .= "\n\n{$group}\n{$underline}\n";
|
||||
|
||||
$currentGroup = $group;
|
||||
}
|
||||
|
||||
$path = './'.$this->locator->getFixerDocumentationFileRelativePath($fixer);
|
||||
|
||||
$attributes = [];
|
||||
|
||||
if ($fixer instanceof DeprecatedFixerInterface) {
|
||||
$attributes[] = 'deprecated';
|
||||
}
|
||||
|
||||
if ($fixer->isRisky()) {
|
||||
$attributes[] = 'risky';
|
||||
}
|
||||
|
||||
$attributes = 0 === \count($attributes)
|
||||
? ''
|
||||
: ' *('.implode(', ', $attributes).')*'
|
||||
;
|
||||
|
||||
$summary = str_replace('`', '``', $fixer->getDefinition()->getSummary());
|
||||
|
||||
$documentation .= <<<RST
|
||||
|
||||
- `{$fixer->getName()} <{$path}>`_{$attributes}
|
||||
|
||||
{$summary}
|
||||
RST;
|
||||
}
|
||||
|
||||
return "{$documentation}\n";
|
||||
}
|
||||
|
||||
private function generateSampleDiff(FixerInterface $fixer, CodeSampleInterface $sample, int $sampleNumber, string $ruleName): string
|
||||
{
|
||||
if ($sample instanceof VersionSpecificCodeSampleInterface && !$sample->isSuitableFor(\PHP_VERSION_ID)) {
|
||||
$existingFile = @file_get_contents($this->locator->getFixerDocumentationFilePath($fixer));
|
||||
|
||||
if (false !== $existingFile) {
|
||||
Preg::match("/\\RExample #{$sampleNumber}\\R.+?(?<diff>\\R\\.\\. code-block:: diff\\R\\R.*?)\\R(?:\\R\\S|$)/s", $existingFile, $matches);
|
||||
|
||||
if (isset($matches['diff'])) {
|
||||
return $matches['diff'];
|
||||
}
|
||||
}
|
||||
|
||||
$error = <<<RST
|
||||
|
||||
.. error::
|
||||
Cannot generate diff for code sample #{$sampleNumber} of rule {$ruleName}:
|
||||
the sample is not suitable for current version of PHP (%s).
|
||||
RST;
|
||||
|
||||
return sprintf($error, PHP_VERSION);
|
||||
}
|
||||
|
||||
$old = $sample->getCode();
|
||||
|
||||
$tokens = Tokens::fromCode($old);
|
||||
$file = $sample instanceof FileSpecificCodeSampleInterface
|
||||
? $sample->getSplFileInfo()
|
||||
: new StdinFileInfo()
|
||||
;
|
||||
|
||||
if ($fixer instanceof ConfigurableFixerInterface) {
|
||||
$fixer->configure($sample->getConfiguration() ?? []);
|
||||
}
|
||||
|
||||
$fixer->fix($file, $tokens);
|
||||
|
||||
$diff = $this->differ->diff($old, $tokens->generateCode());
|
||||
$diff = Preg::replace('/@@[ \+\-\d,]+@@\n/', '', $diff);
|
||||
$diff = Preg::replace('/\r/', '^M', $diff);
|
||||
$diff = Preg::replace('/^ $/m', '', $diff);
|
||||
$diff = Preg::replace('/\n$/', '', $diff);
|
||||
$diff = RstUtils::indent($diff, 3);
|
||||
|
||||
return <<<RST
|
||||
|
||||
.. code-block:: diff
|
||||
|
||||
{$diff}
|
||||
RST;
|
||||
}
|
||||
}
|
||||
+174
@@ -0,0 +1,174 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* This file is part of PHP CS Fixer.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace PhpCsFixer\Documentation;
|
||||
|
||||
use PhpCsFixer\Console\Command\HelpCommand;
|
||||
use PhpCsFixer\Fixer\ConfigurableFixerInterface;
|
||||
use PhpCsFixer\Fixer\DeprecatedFixerInterface;
|
||||
use PhpCsFixer\Fixer\FixerInterface;
|
||||
use PhpCsFixer\FixerConfiguration\AliasedFixerOption;
|
||||
use PhpCsFixer\FixerConfiguration\AllowedValueSubset;
|
||||
use PhpCsFixer\FixerConfiguration\DeprecatedFixerOptionInterface;
|
||||
use PhpCsFixer\RuleSet\RuleSet;
|
||||
use PhpCsFixer\RuleSet\RuleSets;
|
||||
use PhpCsFixer\Utils;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class ListDocumentGenerator
|
||||
{
|
||||
private DocumentationLocator $locator;
|
||||
|
||||
public function __construct(DocumentationLocator $locator)
|
||||
{
|
||||
$this->locator = $locator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param FixerInterface[] $fixers
|
||||
*/
|
||||
public function generateListingDocumentation(array $fixers): string
|
||||
{
|
||||
usort(
|
||||
$fixers,
|
||||
static function (FixerInterface $fixer1, FixerInterface $fixer2): int {
|
||||
return strnatcasecmp($fixer1->getName(), $fixer2->getName());
|
||||
}
|
||||
);
|
||||
|
||||
$documentation = <<<'RST'
|
||||
=======================
|
||||
List of Available Rules
|
||||
=======================
|
||||
|
||||
RST;
|
||||
foreach ($fixers as $fixer) {
|
||||
$name = $fixer->getName();
|
||||
$definition = $fixer->getDefinition();
|
||||
$path = './rules/'.$this->locator->getFixerDocumentationFileRelativePath($fixer);
|
||||
|
||||
$documentation .= "\n- `{$name} <{$path}>`_\n";
|
||||
$documentation .= "\n ".str_replace('`', '``', $definition->getSummary())."\n";
|
||||
|
||||
$description = $definition->getDescription();
|
||||
|
||||
if (null !== $description) {
|
||||
$documentation .= "\n ".RstUtils::toRst($description, 3)."\n";
|
||||
}
|
||||
|
||||
if ($fixer instanceof DeprecatedFixerInterface) {
|
||||
$documentation .= "\n *warning deprecated*";
|
||||
$alternatives = $fixer->getSuccessorsNames();
|
||||
|
||||
if (0 !== \count($alternatives)) {
|
||||
$documentation .= RstUtils::toRst(sprintf(
|
||||
' Use %s instead.',
|
||||
Utils::naturalLanguageJoinWithBackticks($alternatives)
|
||||
), 3);
|
||||
}
|
||||
|
||||
$documentation .= "\n";
|
||||
}
|
||||
|
||||
if ($fixer->isRisky()) {
|
||||
$documentation .= "\n *warning risky* ".RstUtils::toRst($definition->getRiskyDescription(), 3)."\n";
|
||||
}
|
||||
|
||||
if ($fixer instanceof ConfigurableFixerInterface) {
|
||||
$documentation .= "\n Configuration options:\n";
|
||||
$configurationDefinition = $fixer->getConfigurationDefinition();
|
||||
|
||||
foreach ($configurationDefinition->getOptions() as $option) {
|
||||
$documentation .= "\n - | ``{$option->getName()}``";
|
||||
$documentation .= "\n | {$option->getDescription()}";
|
||||
|
||||
if ($option instanceof DeprecatedFixerOptionInterface) {
|
||||
$deprecationMessage = RstUtils::toRst($option->getDeprecationMessage(), 3);
|
||||
$documentation .= "\n | warning:: This option is deprecated and will be removed on next major version. {$deprecationMessage}";
|
||||
}
|
||||
|
||||
if ($option instanceof AliasedFixerOption) {
|
||||
$documentation .= "\n | note:: The previous name of this option was ``{$option->getAlias()}`` but it is now deprecated and will be removed on next major version.";
|
||||
}
|
||||
|
||||
$allowed = HelpCommand::getDisplayableAllowedValues($option);
|
||||
|
||||
if (null === $allowed) {
|
||||
$allowedKind = 'Allowed types';
|
||||
$allowed = array_map(
|
||||
static fn ($value): string => '``'.$value.'``',
|
||||
$option->getAllowedTypes(),
|
||||
);
|
||||
} else {
|
||||
$allowedKind = 'Allowed values';
|
||||
$allowed = array_map(static function ($value): string {
|
||||
return $value instanceof AllowedValueSubset
|
||||
? 'a subset of ``'.HelpCommand::toString($value->getAllowedValues()).'``'
|
||||
: '``'.HelpCommand::toString($value).'``';
|
||||
}, $allowed);
|
||||
}
|
||||
|
||||
$allowed = implode(', ', $allowed);
|
||||
$documentation .= "\n | {$allowedKind}: {$allowed}";
|
||||
|
||||
if ($option->hasDefault()) {
|
||||
$default = HelpCommand::toString($option->getDefault());
|
||||
$documentation .= "\n | Default value: ``{$default}``";
|
||||
} else {
|
||||
$documentation .= "\n | This option is required.";
|
||||
}
|
||||
}
|
||||
|
||||
$documentation .= "\n\n";
|
||||
}
|
||||
|
||||
$ruleSetConfigs = [];
|
||||
|
||||
foreach (RuleSets::getSetDefinitionNames() as $set) {
|
||||
$ruleSet = new RuleSet([$set => true]);
|
||||
|
||||
if ($ruleSet->hasRule($name)) {
|
||||
$ruleSetConfigs[$set] = $ruleSet->getRuleConfiguration($name);
|
||||
}
|
||||
}
|
||||
|
||||
if ([] !== $ruleSetConfigs) {
|
||||
$plural = 1 !== \count($ruleSetConfigs) ? 's' : '';
|
||||
|
||||
$documentation .= "\n Part of rule set{$plural} ";
|
||||
|
||||
foreach ($ruleSetConfigs as $set => $config) {
|
||||
$ruleSetPath = $this->locator->getRuleSetsDocumentationFilePath($set);
|
||||
$ruleSetPath = substr($ruleSetPath, strrpos($ruleSetPath, '/'));
|
||||
|
||||
$documentation .= "`{$set} <./ruleSets{$ruleSetPath}>`_ ";
|
||||
}
|
||||
|
||||
$documentation = rtrim($documentation)."\n";
|
||||
}
|
||||
|
||||
$reflectionObject = new \ReflectionObject($fixer);
|
||||
$className = str_replace('\\', '\\\\', $reflectionObject->getName());
|
||||
$fileName = $reflectionObject->getFileName();
|
||||
$fileName = str_replace('\\', '/', $fileName);
|
||||
$fileName = substr($fileName, strrpos($fileName, '/src/Fixer/') + 1);
|
||||
$fileName = "`Source {$className} <./../{$fileName}>`_";
|
||||
$documentation .= "\n ".$fileName;
|
||||
}
|
||||
|
||||
return $documentation."\n";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* This file is part of PHP CS Fixer.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace PhpCsFixer\Documentation;
|
||||
|
||||
use PhpCsFixer\Preg;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class RstUtils
|
||||
{
|
||||
private function __construct()
|
||||
{
|
||||
// cannot create instance of util. class
|
||||
}
|
||||
|
||||
public static function toRst(string $string, int $indent = 0): string
|
||||
{
|
||||
$string = wordwrap(Preg::replace('/(?<!`)(`.*?`)(?!`)/', '`$1`', $string), 80 - $indent);
|
||||
|
||||
return 0 === $indent ? $string : self::indent($string, $indent);
|
||||
}
|
||||
|
||||
public static function indent(string $string, int $indent): string
|
||||
{
|
||||
return Preg::replace('/(\n)(?!\n|$)/', '$1'.str_repeat(' ', $indent), $string);
|
||||
}
|
||||
}
|
||||
Vendored
+104
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* This file is part of PHP CS Fixer.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace PhpCsFixer\Documentation;
|
||||
|
||||
use PhpCsFixer\Console\Command\HelpCommand;
|
||||
use PhpCsFixer\Fixer\FixerInterface;
|
||||
use PhpCsFixer\Preg;
|
||||
use PhpCsFixer\RuleSet\RuleSetDescriptionInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class RuleSetDocumentationGenerator
|
||||
{
|
||||
private DocumentationLocator $locator;
|
||||
|
||||
public function __construct(DocumentationLocator $locator)
|
||||
{
|
||||
$this->locator = $locator;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param FixerInterface[] $fixers
|
||||
*/
|
||||
public function generateRuleSetsDocumentation(RuleSetDescriptionInterface $definition, array $fixers): string
|
||||
{
|
||||
$fixerNames = [];
|
||||
|
||||
foreach ($fixers as $fixer) {
|
||||
$fixerNames[$fixer->getName()] = $fixer;
|
||||
}
|
||||
|
||||
$title = "Rule set ``{$definition->getName()}``";
|
||||
$titleLine = str_repeat('=', \strlen($title));
|
||||
$doc = "{$titleLine}\n{$title}\n{$titleLine}\n\n".$definition->getDescription();
|
||||
|
||||
if ($definition->isRisky()) {
|
||||
$doc .= ' This set contains rules that are risky.';
|
||||
}
|
||||
|
||||
$doc .= "\n\n";
|
||||
|
||||
$rules = $definition->getRules();
|
||||
|
||||
if (\count($rules) < 1) {
|
||||
$doc .= 'This is an empty set.';
|
||||
} else {
|
||||
$doc .= "Rules\n-----\n";
|
||||
|
||||
foreach ($rules as $rule => $config) {
|
||||
if (str_starts_with($rule, '@')) {
|
||||
$ruleSetPath = $this->locator->getRuleSetsDocumentationFilePath($rule);
|
||||
$ruleSetPath = substr($ruleSetPath, strrpos($ruleSetPath, '/'));
|
||||
|
||||
$doc .= "\n- `{$rule} <.{$ruleSetPath}>`_";
|
||||
} else {
|
||||
$path = Preg::replace(
|
||||
'#^'.preg_quote($this->locator->getFixersDocumentationDirectoryPath(), '#').'/#',
|
||||
'./../rules/',
|
||||
$this->locator->getFixerDocumentationFilePath($fixerNames[$rule])
|
||||
);
|
||||
|
||||
$doc .= "\n- `{$rule} <{$path}>`_";
|
||||
}
|
||||
|
||||
if (!\is_bool($config)) {
|
||||
$doc .= "\n config:\n ``".HelpCommand::toString($config).'``';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $doc."\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<string, string> $setDefinitions
|
||||
*/
|
||||
public function generateRuleSetsDocumentationIndex(array $setDefinitions): string
|
||||
{
|
||||
$documentation = <<<'RST'
|
||||
===========================
|
||||
List of Available Rule sets
|
||||
===========================
|
||||
RST;
|
||||
foreach ($setDefinitions as $name => $path) {
|
||||
$path = substr($path, strrpos($path, '/'));
|
||||
$documentation .= "\n- `{$name} <.{$path}>`_";
|
||||
}
|
||||
|
||||
return $documentation."\n";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user