Skip to content
Merged
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
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

[![Downloads total](https://img.shields.io/packagist/dt/behastan/behastan.svg?style=flat-square)](https://packagist.org/packages/behastan/behastan/stats)

Find unused and duplicated definitions easily – without running Behat tests.

<br>

## Install
Expand Down
2 changes: 1 addition & 1 deletion bin/behastan.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

declare(strict_types=1);

use Rector\Behastan\DependencyInjection\ContainerFactory;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Behastan\DependencyInjection\ContainerFactory;

$possibleAutoloadPaths = [
// dependency
Expand Down
13 changes: 6 additions & 7 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
{
"name": "behastan/behastan",
"description": "Modern Static analysis for Behat tests",
"name": "rector/behastan",
"description": "Static analysis for Behat definitions and context files",
"license": "MIT",
"bin": [
"bin/behastan"
],
"require": {
"php": "^8.2",
"illuminate/container": "^11.41|^12.0",
"nette/utils": "^4.0",
"illuminate/container": "^11.41|^12.37",
"nikic/php-parser": "^5.6",
"symfony/console": "^6.4|^7.0|^8.0",
"symfony/finder": "^6.4|^7.0|^8.0",
"webmozart/assert": "^1.11"
"webmozart/assert": "^1.12"
},
"require-dev": {
"phpstan/extension-installer": "^1.4",
Expand All @@ -25,12 +24,12 @@
},
"autoload": {
"psr-4": {
"Behastan\\": "src"
"Rector\\Behastan\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"Behastan\\Tests\\": "tests"
"Rector\\Behastan\\Tests\\": "tests"
},
"classmap": [
"stubs"
Expand Down
2 changes: 1 addition & 1 deletion ecs.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
use Symplify\EasyCodingStandard\Config\ECSConfig;

return ECSConfig::configure()
->withPaths([__DIR__ . '/src', __DIR__ . '/tests'])
->withPaths([__DIR__ . '/bin', __DIR__ . '/src', __DIR__ . '/tests'])
->withRootFiles()
->withPreparedSets(psr12: true, common: true, symplify: true);
8 changes: 4 additions & 4 deletions src/Analyzer/ClassMethodContextDefinitionsAnalyzer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@

declare(strict_types=1);

namespace Behastan\Analyzer;
namespace Rector\Behastan\Analyzer;

use Behastan\PhpParser\SimplePhpParser;
use Behastan\Resolver\ClassMethodMasksResolver;
use Behastan\ValueObject\ClassMethodContextDefinition;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\NodeFinder;
use PhpParser\PrettyPrinter\Standard;
use Rector\Behastan\PhpParser\SimplePhpParser;
use Rector\Behastan\Resolver\ClassMethodMasksResolver;
use Rector\Behastan\ValueObject\ClassMethodContextDefinition;
use Symfony\Component\Finder\SplFileInfo;

final readonly class ClassMethodContextDefinitionsAnalyzer
Expand Down
2 changes: 1 addition & 1 deletion src/Analyzer/MaskAnalyzer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\Analyzer;
namespace Rector\Behastan\Analyzer;

final class MaskAnalyzer
{
Expand Down
25 changes: 13 additions & 12 deletions src/Analyzer/UnusedDefinitionsAnalyzer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

declare(strict_types=1);

namespace Behastan\Analyzer;

use Behastan\DefinitionMasksResolver;
use Behastan\Reporting\MaskCollectionStatsPrinter;
use Behastan\UsedInstructionResolver;
use Behastan\ValueObject\Mask\AbstractMask;
use Behastan\ValueObject\Mask\ExactMask;
use Behastan\ValueObject\Mask\NamedMask;
use Behastan\ValueObject\Mask\RegexMask;
use Behastan\ValueObject\Mask\SkippedMask;
namespace Rector\Behastan\Analyzer;

use Nette\Utils\Strings;
use Rector\Behastan\DefinitionMasksResolver;
use Rector\Behastan\Reporting\MaskCollectionStatsPrinter;
use Rector\Behastan\UsedInstructionResolver;
use Rector\Behastan\ValueObject\Mask\AbstractMask;
use Rector\Behastan\ValueObject\Mask\ExactMask;
use Rector\Behastan\ValueObject\Mask\NamedMask;
use Rector\Behastan\ValueObject\Mask\RegexMask;
use Rector\Behastan\ValueObject\Mask\SkippedMask;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Finder\SplFileInfo;

Expand Down Expand Up @@ -68,7 +68,7 @@ public function analyse(array $contextFiles, array $featureFiles): array
private function isRegexDefinitionUsed(string $regexBehatDefinition, array $featureInstructions): bool
{
foreach ($featureInstructions as $featureInstruction) {
if (Strings::match($featureInstruction, $regexBehatDefinition)) {
if (preg_match($featureInstruction, $regexBehatDefinition)) {
// it is used!
return true;
}
Expand Down Expand Up @@ -98,7 +98,8 @@ private function isMaskUsed(AbstractMask $mask, array $featureInstructions): boo

if ($mask instanceof NamedMask) {
// normalize :mask definition to regex
$regexMask = '#' . Strings::replace($mask->mask, self::MASK_VALUE_REGEX, '(.*?)') . '#';
$regexMask = '#' . preg_replace(self::MASK_VALUE_REGEX, '(.*?)', $mask->mask) . '#';

if ($this->isRegexDefinitionUsed($regexMask, $featureInstructions)) {
return true;
}
Expand Down
8 changes: 4 additions & 4 deletions src/Command/DuplicatedDefinitionsCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

declare(strict_types=1);

namespace Behastan\Command;
namespace Rector\Behastan\Command;

use Behastan\Analyzer\ClassMethodContextDefinitionsAnalyzer;
use Behastan\Enum\Option;
use Behastan\Finder\BehatMetafilesFinder;
use Rector\Behastan\Analyzer\ClassMethodContextDefinitionsAnalyzer;
use Rector\Behastan\Enum\Option;
use Rector\Behastan\Finder\BehatMetafilesFinder;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
Expand Down
10 changes: 5 additions & 5 deletions src/Command/StatsCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

declare(strict_types=1);

namespace Behastan\Command;
namespace Rector\Behastan\Command;

use Behastan\Analyzer\ClassMethodContextDefinitionsAnalyzer;
use Behastan\Analyzer\MaskAnalyzer;
use Behastan\Finder\BehatMetafilesFinder;
use Behastan\UsedInstructionResolver;
use Rector\Behastan\Analyzer\ClassMethodContextDefinitionsAnalyzer;
use Rector\Behastan\Analyzer\MaskAnalyzer;
use Rector\Behastan\Finder\BehatMetafilesFinder;
use Rector\Behastan\UsedInstructionResolver;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
Expand Down
10 changes: 5 additions & 5 deletions src/Command/UnusedDefinitionsCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

declare(strict_types=1);

namespace Behastan\Command;
namespace Rector\Behastan\Command;

use Behastan\Analyzer\UnusedDefinitionsAnalyzer;
use Behastan\Enum\Option;
use Behastan\Finder\BehatMetafilesFinder;
use Behastan\ValueObject\Mask\AbstractMask;
use Rector\Behastan\Analyzer\UnusedDefinitionsAnalyzer;
use Rector\Behastan\Enum\Option;
use Rector\Behastan\Finder\BehatMetafilesFinder;
use Rector\Behastan\ValueObject\Mask\AbstractMask;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
Expand Down
2 changes: 1 addition & 1 deletion src/Contract/MaskInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\Contract;
namespace Rector\Behastan\Contract;

interface MaskInterface
{
Expand Down
22 changes: 11 additions & 11 deletions src/DefinitionMasksResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@

declare(strict_types=1);

namespace Behastan;

use Behastan\Analyzer\MaskAnalyzer;
use Behastan\PhpParser\SimplePhpParser;
use Behastan\Resolver\ClassMethodMasksResolver;
use Behastan\ValueObject\ClassMethodContextDefinition;
use Behastan\ValueObject\Mask\ExactMask;
use Behastan\ValueObject\Mask\NamedMask;
use Behastan\ValueObject\Mask\RegexMask;
use Behastan\ValueObject\Mask\SkippedMask;
use Behastan\ValueObject\MaskCollection;
namespace Rector\Behastan;

use PhpParser\Node\Name;
use PhpParser\Node\Stmt\Class_;
use PhpParser\NodeFinder;
use Rector\Behastan\Analyzer\MaskAnalyzer;
use Rector\Behastan\PhpParser\SimplePhpParser;
use Rector\Behastan\Resolver\ClassMethodMasksResolver;
use Rector\Behastan\ValueObject\ClassMethodContextDefinition;
use Rector\Behastan\ValueObject\Mask\ExactMask;
use Rector\Behastan\ValueObject\Mask\NamedMask;
use Rector\Behastan\ValueObject\Mask\RegexMask;
use Rector\Behastan\ValueObject\Mask\SkippedMask;
use Rector\Behastan\ValueObject\MaskCollection;
use SplFileInfo;

final readonly class DefinitionMasksResolver
Expand Down
8 changes: 4 additions & 4 deletions src/DependencyInjection/ContainerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

declare(strict_types=1);

namespace Behastan\DependencyInjection;
namespace Rector\Behastan\DependencyInjection;

use Behastan\Command\DuplicatedDefinitionsCommand;
use Behastan\Command\StatsCommand;
use Behastan\Command\UnusedDefinitionsCommand;
use Illuminate\Container\Container;
use PhpParser\Parser;
use PhpParser\ParserFactory;
use Rector\Behastan\Command\DuplicatedDefinitionsCommand;
use Rector\Behastan\Command\StatsCommand;
use Rector\Behastan\Command\UnusedDefinitionsCommand;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\ConsoleOutput;
Expand Down
2 changes: 1 addition & 1 deletion src/Enum/Option.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\Enum;
namespace Rector\Behastan\Enum;

final class Option
{
Expand Down
2 changes: 1 addition & 1 deletion src/Finder/BehatMetafilesFinder.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\Finder;
namespace Rector\Behastan\Finder;

use Symfony\Component\Finder\Finder;
use Symfony\Component\Finder\SplFileInfo;
Expand Down
2 changes: 1 addition & 1 deletion src/PhpParser/SimplePhpParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\PhpParser;
namespace Rector\Behastan\PhpParser;

use PhpParser\Node\Stmt;
use PhpParser\NodeTraverser;
Expand Down
16 changes: 8 additions & 8 deletions src/Reporting/MaskCollectionStatsPrinter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

declare(strict_types=1);

namespace Behastan\Reporting;

use Behastan\ValueObject\Mask\AbstractMask;
use Behastan\ValueObject\Mask\ExactMask;
use Behastan\ValueObject\Mask\NamedMask;
use Behastan\ValueObject\Mask\RegexMask;
use Behastan\ValueObject\Mask\SkippedMask;
use Behastan\ValueObject\MaskCollection;
namespace Rector\Behastan\Reporting;

use Rector\Behastan\ValueObject\Mask\AbstractMask;
use Rector\Behastan\ValueObject\Mask\ExactMask;
use Rector\Behastan\ValueObject\Mask\NamedMask;
use Rector\Behastan\ValueObject\Mask\RegexMask;
use Rector\Behastan\ValueObject\Mask\SkippedMask;
use Rector\Behastan\ValueObject\MaskCollection;
use Symfony\Component\Console\Style\SymfonyStyle;

final readonly class MaskCollectionStatsPrinter
Expand Down
2 changes: 1 addition & 1 deletion src/Resolver/ClassMethodMasksResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\Resolver;
namespace Rector\Behastan\Resolver;

use PhpParser\Comment\Doc;
use PhpParser\Node\Scalar\String_;
Expand Down
9 changes: 5 additions & 4 deletions src/UsedInstructionResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

declare(strict_types=1);

namespace Behastan;
namespace Rector\Behastan;

use Nette\Utils\Strings;
use RuntimeException;
use Symfony\Component\Finder\SplFileInfo;

Expand All @@ -19,9 +18,11 @@ public function resolveInstructionsFromFeatureFiles(array $featureFileInfos): ar
$instructions = [];

foreach ($featureFileInfos as $featureFileInfo) {
$matches = Strings::matchAll(
preg_match_all(
'#\s+(Given|When|And|Then)\s+(?<instruction>.*?)\n#m',
$featureFileInfo->getContents(),
'#\s+(Given|When|And|Then)\s+(?<instruction>.*?)\n#m'
$matches,
PREG_SET_ORDER
);

if ($matches === []) {
Expand Down
2 changes: 1 addition & 1 deletion src/ValueObject/ClassMethodContextDefinition.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\ValueObject;
namespace Rector\Behastan\ValueObject;

final class ClassMethodContextDefinition
{
Expand Down
4 changes: 2 additions & 2 deletions src/ValueObject/Mask/AbstractMask.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?php

namespace Behastan\ValueObject\Mask;
namespace Rector\Behastan\ValueObject\Mask;

use Behastan\Contract\MaskInterface;
use Rector\Behastan\Contract\MaskInterface;

abstract class AbstractMask implements MaskInterface
{
Expand Down
2 changes: 1 addition & 1 deletion src/ValueObject/Mask/ExactMask.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\ValueObject\Mask;
namespace Rector\Behastan\ValueObject\Mask;

final class ExactMask extends AbstractMask
{
Expand Down
2 changes: 1 addition & 1 deletion src/ValueObject/Mask/NamedMask.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\ValueObject\Mask;
namespace Rector\Behastan\ValueObject\Mask;

final class NamedMask extends AbstractMask
{
Expand Down
2 changes: 1 addition & 1 deletion src/ValueObject/Mask/RegexMask.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\ValueObject\Mask;
namespace Rector\Behastan\ValueObject\Mask;

final class RegexMask extends AbstractMask
{
Expand Down
2 changes: 1 addition & 1 deletion src/ValueObject/Mask/SkippedMask.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Behastan\ValueObject\Mask;
namespace Rector\Behastan\ValueObject\Mask;

final class SkippedMask extends AbstractMask
{
Expand Down
Loading