diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..740910f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: https://bit.ly/CodelyTvPro diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..3cee878 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,33 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + php-versions: ['8.0', '8.1', '8.2'] + + name: PHP ${{ matrix.php-versions }} + + steps: + - uses: actions/checkout@v4 + + - name: ๐Ÿ˜ Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + tools: composer:v2 + + - name: โฌ‡๏ธ Install dependencies + run: composer install + + - name: ๐Ÿฎ Lint + run: ./vendor/bin/ecs check diff --git a/README.md b/README.md new file mode 100644 index 0000000..155aabf --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +

+ + + +

+ +

+ โœ๏ธ Codely's Easy Coding Standards configuration +

+ +

+ Codely Open Source + CodelyTV Courses +

+ +

+ Opinionated linting configuration considering modern PHP best practices and providing consistency. ๐Ÿ‘Œ +
+
+ Take a look, play and have fun with this. + Stars are welcome ๐Ÿ˜Š +

+ +## ๐Ÿ‘€ How to use + +1. Install the dependency + ```sh + composer require --dev codelytv/coding-style + ``` +2. Add it to your `ecs.php` file: + ```php + use Codelytv\CodingStyle\CodelyRules; + use Symplify\EasyCodingStandard\Config\ECSConfig; + + return function (ECSConfig $ecsConfig): void { + $ecsConfig->paths([__DIR__ . '/src',]); + + $ecsConfig->sets([CodelyRules::CODING_STYLE]); + }; + ``` +3. Execute it: + ```sh + ./vendor/bin/ecs check + ``` + +## ๐Ÿค” What it does + +- Lints PHP using PSR-12 +- Extends some config (you can see all the rules [here](src/coding_style.php)) +- Use tabs to indent ([reason](https://www.youtube.com/watch?v=yD2T42zsP7c)) + +## ๐Ÿ‘Œย Codely Code Quality Standards + +Publishing this package we are committing ourselves to the following code quality standards: + +- ๐Ÿค Respect **Semantic Versioning**: No breaking changes in patch or minor versions +- ๐Ÿคย No surprises in transitive dependencies: Use the **bare minimum dependencies** needed to meet the purpose +- ๐ŸŽฏย **One specific purpose** to meet without having to carry a bunch of unnecessary other utilities +- ๐Ÿ“– **Well documented Readme** showing how to install and use +- โš–๏ธ **License favoring Open Source** and collaboration diff --git a/composer.json b/composer.json index c78ae32..a13c4c8 100644 --- a/composer.json +++ b/composer.json @@ -3,6 +3,7 @@ "description": "PHP Coding Style rules we use in Codely", "type": "library", "keywords": ["static analysis", "code style"], + "license": "AGPL-3.0-or-later", "autoload": { "psr-4": { "Codelytv\\CodingStyle\\": "src/" diff --git a/ecs.php b/ecs.php new file mode 100644 index 0000000..d5b238e --- /dev/null +++ b/ecs.php @@ -0,0 +1,12 @@ +paths([__DIR__ . '/src',]); + + $ecsConfig->sets([CodelyRules::CODING_STYLE]); +}; diff --git a/src/CodelyRules.php b/src/CodelyRules.php index 739057d..32390eb 100644 --- a/src/CodelyRules.php +++ b/src/CodelyRules.php @@ -1,8 +1,10 @@ sets([SetList::PSR_12]); -return static function (ECSConfig $ecsConfig) : void { - $ecsConfig->sets([SetList::PSR_12]); + $ecsConfig->rules([ + // Imports + NoUnusedImportsFixer::class, + FullyQualifiedStrictTypesFixer::class, + GlobalNamespaceImportFixer::class, + NoLeadingImportSlashFixer::class, + // Arrays + TrimArraySpacesFixer::class, + // Blank lines + BlankLineAfterStrictTypesFixer::class, + NoBlankLinesAfterClassOpeningFixer::class, + // Spacing + SingleLineEmptyBodyFixer::class, + CastSpacesFixer::class, + TypeDeclarationSpacesFixer::class, + TypesSpacesFixer::class, + // Casing + ClassReferenceNameCasingFixer::class, + LowercaseStaticReferenceFixer::class, + MagicMethodCasingFixer::class, + NativeFunctionCasingFixer::class, + NativeFunctionTypeDeclarationCasingFixer::class, + // Architecture + FinalClassFixer::class, + FinalPublicMethodForAbstractClassFixer::class, + ProtectedToPrivateFixer::class, + VisibilityRequiredFixer::class, + DateTimeImmutableFixer::class, + NoUselessElseFixer::class, + // Operator + AssignNullCoalescingToCoalesceEqualFixer::class, + NoUselessConcatOperatorFixer::class, + NoUselessNullsafeOperatorFixer::class, + ObjectOperatorWithoutWhitespaceFixer::class, + TernaryToElvisOperatorFixer::class, + TernaryToNullCoalescingFixer::class, + // Testing + PhpUnitConstructFixer::class, + PhpUnitDedicateAssertFixer::class, + PhpUnitDedicateAssertInternalTypeFixer::class, + PhpUnitExpectationFixer::class, + // Other + LineLengthFixer::class, + NoNullPropertyInitializationFixer::class, + NoUnneededFinalMethodFixer::class, + SelfAccessorFixer::class, + SelfStaticAccessorFixer::class, + NoUnneededControlParenthesesFixer::class, + NoUnneededCurlyBracesFixer::class, + SimplifiedIfReturnFixer::class, + TrailingCommaInMultilineFixer::class, + DeclareStrictTypesFixer::class, + StrictComparisonFixer::class, + SingleQuoteFixer::class, + StatementIndentationFixer::class, + ]); - $ecsConfig->rules([ - // Imports - NoUnusedImportsFixer::class, - FullyQualifiedStrictTypesFixer::class, - GlobalNamespaceImportFixer::class, - NoLeadingImportSlashFixer::class, - // Arrays - TrimArraySpacesFixer::class, - // Blank lines - BlankLineAfterStrictTypesFixer::class, - NoBlankLinesAfterClassOpeningFixer::class, - // Spacing - SingleLineEmptyBodyFixer::class, - CastSpacesFixer::class, - TypeDeclarationSpacesFixer::class, - TypesSpacesFixer::class, - // Casing - ClassReferenceNameCasingFixer::class, - LowercaseStaticReferenceFixer::class, - MagicMethodCasingFixer::class, - NativeFunctionCasingFixer::class, - NativeFunctionTypeDeclarationCasingFixer::class, - // Architecture - FinalClassFixer::class, - FinalPublicMethodForAbstractClassFixer::class, - ProtectedToPrivateFixer::class, - VisibilityRequiredFixer::class, - DateTimeImmutableFixer::class, - NoUselessElseFixer::class, - // Operator - AssignNullCoalescingToCoalesceEqualFixer::class, - NoUselessConcatOperatorFixer::class, - NoUselessNullsafeOperatorFixer::class, - ObjectOperatorWithoutWhitespaceFixer::class, - TernaryToElvisOperatorFixer::class, - TernaryToNullCoalescingFixer::class, - // Testing - PhpUnitConstructFixer::class, - PhpUnitDedicateAssertFixer::class, - PhpUnitDedicateAssertInternalTypeFixer::class, - PhpUnitExpectationFixer::class, - // Other - LineLengthFixer::class, - NoNullPropertyInitializationFixer::class, - NoUnneededFinalMethodFixer::class, - SelfAccessorFixer::class, - SelfStaticAccessorFixer::class, - NoUnneededControlParenthesesFixer::class, - NoUnneededCurlyBracesFixer::class, - SimplifiedIfReturnFixer::class, - TrailingCommaInMultilineFixer::class, - DeclareStrictTypesFixer::class, - StrictComparisonFixer::class, - SingleQuoteFixer::class, - StatementIndentationFixer::class, - ]); + $ecsConfig->ruleWithConfiguration(ArraySyntaxFixer::class, ['syntax' => 'short']); + $ecsConfig->ruleWithConfiguration(LineLengthFixer::class, [LineLengthFixer::LINE_LENGTH => 120]); + $ecsConfig->ruleWithConfiguration( + YodaStyleFixer::class, + ['equal' => false, 'identical' => false, 'less_and_greater' => false] + ); + $ecsConfig->ruleWithConfiguration(PhpUnitMethodCasingFixer::class, ['case' => PhpUnitMethodCasingFixer::SNAKE_CASE]); + $ecsConfig->ruleWithConfiguration(OrderedTypesFixer::class, ['null_adjustment' => 'always_last']); - $ecsConfig->ruleWithConfiguration(ArraySyntaxFixer::class, ['syntax' => 'short']); - $ecsConfig->ruleWithConfiguration(LineLengthFixer::class, [LineLengthFixer::LINE_LENGTH => 120]); - $ecsConfig->ruleWithConfiguration(YodaStyleFixer::class, ['equal' => false, 'identical' => false, 'less_and_greater' => false]); - $ecsConfig->ruleWithConfiguration(PhpUnitMethodCasingFixer::class, ['case' => PhpUnitMethodCasingFixer::SNAKE_CASE]); - $ecsConfig->ruleWithConfiguration(OrderedTypesFixer::class, ['null_adjustment' => 'always_last']); + $ecsConfig->indentation('tab'); };