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
+
+
+
+
+
+
+
+
+ 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');
};