Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#65 - purge mode #86

Merged
merged 3 commits into from
May 30, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
12 changes: 11 additions & 1 deletion src/Config.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
use Blumilk\Codestyle\Configuration\Defaults\LaravelPaths;
use Blumilk\Codestyle\Configuration\Paths;
use Blumilk\Codestyle\Configuration\Rules;
use Blumilk\Codestyle\Configuration\Utils\Rule;
use Blumilk\Codestyle\Fixers\DoubleQuoteFixer;
use Blumilk\Codestyle\Fixers\NoCommentFixer;
use Blumilk\Codestyle\Fixers\NoLaravelMigrationsGeneratedCommentFixer;
use JetBrains\PhpStorm\ArrayShape;
use PhpCsFixer\Config as PhpCsFixerConfig;
Expand Down Expand Up @@ -42,8 +44,8 @@ public function config(): PhpCsFixerConfig
}

$finder = Finder::create()->directories()->append($files);

$config = new PhpCsFixerConfig("Blumilk codestyle standard");

return $config->setFinder($finder)
->setUsingCache(false)
->registerCustomFixers(new PhpCsFixerCustomFixers())
Expand All @@ -61,6 +63,13 @@ public function options(): array
];
}

public function purgeMode(): static
{
$this->rules->add(new Rule(NoCommentFixer::class));

return $this;
}

protected function getAllFiles(array &$paths, string $path): void
{
if (is_file($path) || !is_dir($path)) {
Expand All @@ -83,6 +92,7 @@ protected function getCustomFixers(): array
return [
new DoubleQuoteFixer(),
new NoLaravelMigrationsGeneratedCommentFixer(),
new NoCommentFixer(),
];
}
}
2 changes: 0 additions & 2 deletions src/Configuration/Defaults/CommonRules.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
use Blumilk\Codestyle\Fixers\DoubleQuoteFixer;
use Blumilk\Codestyle\Fixers\NoLaravelMigrationsGeneratedCommentFixer;
use PhpCsFixer\Fixer\ArrayNotation\ArraySyntaxFixer;
use PhpCsFixer\Fixer\ArrayNotation\NoTrailingCommaInSinglelineArrayFixer;
use PhpCsFixer\Fixer\ArrayNotation\NoWhitespaceBeforeCommaInArrayFixer;
use PhpCsFixer\Fixer\ArrayNotation\TrimArraySpacesFixer;
use PhpCsFixer\Fixer\ArrayNotation\WhitespaceAfterCommaInArrayFixer;
Expand Down Expand Up @@ -113,7 +112,6 @@ class CommonRules extends Rules
ArrayIndentationFixer::class => true,
TrimArraySpacesFixer::class => true,
WhitespaceAfterCommaInArrayFixer::class => true,
NoTrailingCommaInSinglelineArrayFixer::class => true,
mtracz marked this conversation as resolved.
Show resolved Hide resolved
ArraySyntaxFixer::class => ["syntax" => "short"],
PhpUnitMethodCasingFixer::class => true,
FunctionToConstantFixer::class => true,
Expand Down
3 changes: 3 additions & 0 deletions src/Configuration/Utils/Rule.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@

class Rule
{
/**
* @param class-string $fixer
*/
public function __construct(
protected string $fixer,
protected ?array $options = null,
Expand Down
80 changes: 80 additions & 0 deletions src/Fixers/NoCommentFixer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<?php

declare(strict_types=1);

namespace Blumilk\Codestyle\Fixers;

use PhpCsFixer\Fixer\FixerInterface;
use PhpCsFixer\Fixer\Whitespace\NoExtraBlankLinesFixer;
use PhpCsFixer\FixerDefinition\CodeSample;
use PhpCsFixer\FixerDefinition\FixerDefinition;
use PhpCsFixer\FixerDefinition\FixerDefinitionInterface;
use PhpCsFixer\Tokenizer\Tokens;
use PhpCsFixerCustomFixers\TokenRemover;
use SplFileInfo;

final class NoCommentFixer implements FixerInterface
mtracz marked this conversation as resolved.
Show resolved Hide resolved
{
public function getDefinition(): FixerDefinitionInterface
{
$codeSample = <<<'EOF'
<?php

class Migration
{
public function up()
{
Schema::create("sessions", function (Blueprint $table) {
// test
$table->string("id")->primary();
$table->text("payload");
});
}
};
EOF;

return new FixerDefinition(
"There can be no comments.",
[
new CodeSample($codeSample),
],
);
}

public function getName(): string
{
return "Blumilk/no_comments";
}

public function getPriority(): int
{
$fixer = new NoExtraBlankLinesFixer();
return $fixer->getPriority() + 1;
}

public function supports(SplFileInfo $file): bool
{
return true;
}

public function isCandidate(Tokens $tokens): bool
{
return $tokens->isAnyTokenKindsFound([T_COMMENT, T_DOC_COMMENT]);
}

public function isRisky(): bool
{
return true;
}

public function fix(SplFileInfo $file, Tokens $tokens): void
{
for ($index = $tokens->count() - 1; $index > 0; $index--) {
if (!$tokens[$index]->isGivenKind([T_COMMENT])) {
continue;
}

TokenRemover::removeWithLinesIfPossible($tokens, $index);
}
}
}
25 changes: 20 additions & 5 deletions tests/codestyle/CodestyleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,33 +68,48 @@ public function testPhp81Fixtures(): void
/**
* @throws Exception
*/
protected function runFixer(bool $fix = false): bool
public function testPurgeFixtures(): void
{
$fixtures = [
"noComments",
];

foreach ($fixtures as $fixture) {
$this->testFixture($fixture, purge: true);
}
}

/**
* @throws Exception
*/
protected function runFixer(bool $fix = false, bool $purge = false): bool
{
$dryRun = $fix ? "" : "--dry-run";

$application = new Application();
$application->setAutoExit(false);

$output = new BufferedOutput();
$result = $application->run(new StringInput("fix {$dryRun} --diff --config ./tests/codestyle/config.php"), $output);
$configFileName = !$purge ? "config.php" : "config.purge.php";
$result = $application->run(new StringInput("fix {$dryRun} --diff --config ./tests/codestyle/$configFileName"), $output);

return $result === 0;
}

/**
* @throws Exception
*/
protected function testFixture(string $name): void
protected function testFixture(string $name, bool $purge = false): void
{
copy(__DIR__ . "/fixtures/{$name}/actual.php", __DIR__ . "/tmp/{$name}.php");

$this->assertFalse(
$this->runFixer(),
$this->runFixer(purge: $purge),
"Fixture fixtures/{$name} returned invalid true result.",
);

$this->assertTrue(
$this->runFixer(fix: true),
$this->runFixer(fix: true, purge: $purge),
"Fixture fixtures/{$name} was not proceeded properly.",
);

Expand Down
12 changes: 12 additions & 0 deletions tests/codestyle/config.purge.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

use Blumilk\Codestyle\Config;
use Blumilk\Codestyle\Configuration\Defaults\Paths;

$config = new Config(
paths: new Paths("tests/codestyle/tmp"),
);

return $config->purgeMode()->config();
147 changes: 147 additions & 0 deletions tests/codestyle/fixtures/noComments/actual.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
<?php

declare(strict_types=1);

use Illuminate\Support\Str;

return [
/*
|--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for all database work. Of course
| you may use many connections at once using the Database library.
|
*/

"default" => env("DB_CONNECTION", "mysql"),

/*
|--------------------------------------------------------------------------
| Database Connections
|--------------------------------------------------------------------------
|
| Here are each of the database connections setup for your application.
| Of course, examples of configuring each database platform that is
| supported by Laravel is shown below to make development simple.
|
|
| All database work in Laravel is done through the PHP PDO facilities
| so make sure you have the driver for your particular database of
| choice installed on your machine before you begin development.
|
*/

"connections" => [
"sqlite" => [
"driver" => "sqlite",
"url" => env("DATABASE_URL"),
"database" => env("DB_DATABASE", database_path("database.sqlite")),
"prefix" => "",
"foreign_key_constraints" => env("DB_FOREIGN_KEYS", true),
],

"mysql" => [
"driver" => "mysql",
"url" => env("DATABASE_URL"),
"host" => env("DB_HOST", "127.0.0.1"),
"port" => env("DB_PORT", "3306"),
"database" => env("DB_DATABASE", "forge"),
"username" => env("DB_USERNAME", "forge"),
"password" => env("DB_PASSWORD", ""),
"unix_socket" => env("DB_SOCKET", ""),
"charset" => "utf8mb4",
"collation" => "utf8mb4_unicode_ci",
"prefix" => "",
"prefix_indexes" => true,
"strict" => true,
"engine" => null,
"options" => extension_loaded("pdo_mysql") ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env("MYSQL_ATTR_SSL_CA"),
]) : [],
],

"pgsql" => [
"driver" => "pgsql",
"url" => env("DATABASE_URL"),
"host" => env("DB_HOST", "127.0.0.1"),
"port" => env("DB_PORT", "5432"),
"database" => env("DB_DATABASE", "forge"),
"username" => env("DB_USERNAME", "forge"),
"password" => env("DB_PASSWORD", ""),
"charset" => "utf8",
"prefix" => "",
"prefix_indexes" => true,
"search_path" => "public",
"sslmode" => "prefer",
],

"sqlsrv" => [
"driver" => "sqlsrv",
"url" => env("DATABASE_URL"),
"host" => env("DB_HOST", "localhost"),
"port" => env("DB_PORT", "1433"),
"database" => env("DB_DATABASE", "forge"),
"username" => env("DB_USERNAME", "forge"),
"password" => env("DB_PASSWORD", ""),
"charset" => "utf8",
"prefix" => "",
"prefix_indexes" => true,
// 'encrypt' => env('DB_ENCRYPT', 'yes'),
// 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
],
],

/*
|--------------------------------------------------------------------------
| Migration Repository Table
|--------------------------------------------------------------------------
|
| This table keeps track of all the migrations that have already run for
| your application. Using this information, we can determine which of
| the migrations on disk haven't actually been run in the database.
|
*/

"migrations" => "migrations",

/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
| provides a richer body of commands than a typical key-value system
| such as APC or Memcached. Laravel makes it easy to dig right in.
|
*/

"redis" => [
"client" => env("REDIS_CLIENT", "phpredis"),

"options" => [
"cluster" => env("REDIS_CLUSTER", "redis"),
"prefix" => env("REDIS_PREFIX", Str::slug(env("APP_NAME", "laravel"), "_") . "_database_"),
],

"default" => [
"url" => env("REDIS_URL"),
"host" => env("REDIS_HOST", "127.0.0.1"),
"username" => env("REDIS_USERNAME"),
"password" => env("REDIS_PASSWORD"),
"port" => env("REDIS_PORT", "6379"),
"database" => env("REDIS_DB", "0"),
],

"cache" => [
"url" => env("REDIS_URL"),
"host" => env("REDIS_HOST", "127.0.0.1"),
"username" => env("REDIS_USERNAME"),
"password" => env("REDIS_PASSWORD"),
"port" => env("REDIS_PORT", "6379"),
"database" => env("REDIS_CACHE_DB", "1"),
],
],
];
Loading