diff --git a/src/Plugins/Tia.php b/src/Plugins/Tia.php index 50936c0d..9c36ce28 100644 --- a/src/Plugins/Tia.php +++ b/src/Plugins/Tia.php @@ -49,6 +49,10 @@ final class Tia implements AddsOutput, HandlesArguments, Terminable private const string FILTERED_OPTION = '--filtered'; + private const string ENV_TIA = 'PEST_TIA'; + + private const string ENV_FILTERED = 'PEST_TIA_FILTERED'; + public const string KEY_GRAPH = 'graph.json'; public const string KEY_AFFECTED = 'affected.json'; @@ -174,7 +178,7 @@ final class Tia implements AddsOutput, HandlesArguments, Terminable */ public static function isEnabledForRun(array $arguments): bool { - if (in_array(self::OPTION, $arguments, true)) { + if (in_array(self::OPTION, $arguments, true) || self::envFlagEnabled(self::ENV_TIA)) { return true; } @@ -188,6 +192,11 @@ final class Tia implements AddsOutput, HandlesArguments, Terminable return ! ($watchPatterns->isLocally() && in_array('--ci', $arguments, true)); } + private static function envFlagEnabled(string $name): bool + { + return filter_var(getenv($name), FILTER_VALIDATE_BOOL); + } + public function getStatus(string $filename, string $testId): ?TestStatus { if (! $this->replayGraph instanceof Graph) { @@ -249,11 +258,11 @@ final class Tia implements AddsOutput, HandlesArguments, Terminable /** @var WatchPatterns $watchPatterns */ $watchPatterns = Container::getInstance()->get(WatchPatterns::class); $disabled = $this->hasArgument(self::NO_OPTION, $arguments); - $cliEnabled = $this->hasArgument(self::OPTION, $arguments); + $cliEnabled = $this->hasArgument(self::OPTION, $arguments) || self::envFlagEnabled(self::ENV_TIA); $alwaysEnabled = $watchPatterns->isEnabled() && (! $watchPatterns->isLocally() || Environment::name() === Environment::LOCAL); $enabled = ! $disabled && ($cliEnabled || $alwaysEnabled); - $this->filteredMode = ($this->hasArgument(self::FILTERED_OPTION, $arguments) || $watchPatterns->isFiltered()) + $this->filteredMode = ($this->hasArgument(self::FILTERED_OPTION, $arguments) || self::envFlagEnabled(self::ENV_FILTERED) || $watchPatterns->isFiltered()) && ! $this->hasExplicitPathArgument($arguments); $freshRequested = $this->hasArgument(self::FRESH_OPTION, $arguments); $this->forceRefetch = $this->hasArgument(self::REFETCH_OPTION, $arguments); diff --git a/src/Plugins/Tia/Fingerprint.php b/src/Plugins/Tia/Fingerprint.php index 1d78d85c..3be4b8f3 100644 --- a/src/Plugins/Tia/Fingerprint.php +++ b/src/Plugins/Tia/Fingerprint.php @@ -9,12 +9,12 @@ namespace Pest\Plugins\Tia; */ final readonly class Fingerprint { - private const int SCHEMA_VERSION = 14; + private const int SCHEMA_VERSION = 15; /** * @return array{ * structural: array, - * environmental: array, + * environmental: array, * } */ public static function compute(string $projectRoot): array @@ -22,6 +22,7 @@ final readonly class Fingerprint return [ 'structural' => [ 'schema' => self::SCHEMA_VERSION, + 'composer_lock' => self::composerLockHash($projectRoot), 'phpunit_xml' => self::hashIfExists($projectRoot.'/phpunit.xml'), 'phpunit_xml_dist' => self::hashIfExists($projectRoot.'/phpunit.xml.dist'), 'pest_factory' => self::contentHashOrNull(__DIR__.'/../../Factories/TestCaseFactory.php'), @@ -33,6 +34,10 @@ final readonly class Fingerprint 'composer_json' => self::composerJsonHash($projectRoot), ], 'environmental' => [ + 'php_minor' => PHP_MAJOR_VERSION, + + // 'extensions' => self::extensionsFingerprint($projectRoot), + // 'env_files' => self::envFilesHash($projectRoot), ], ]; } @@ -226,6 +231,11 @@ final readonly class Fingerprint return $json === false ? null : hash('xxh128', $json); } + private static function composerLockHash(string $projectRoot): ?string + { + return self::hashIfExists($projectRoot.'/composer.lock'); + } + private static function packageLockHash(string $projectRoot): ?string { $parts = [];