From b3daa0c6fe68baac2fe2a926157a5b3953a2873d Mon Sep 17 00:00:00 2001 From: Andrew Bashtannik Date: Sat, 28 Sep 2024 18:19:46 +0300 Subject: [PATCH] Skeleton --- .github/dependabot.yml | 8 + .github/workflows/unit-tests.yml | 62 + .github/workflows/update-changelog.yml | 32 + .gitignore | 4 + CHANGELOG.md | 81 + LICENSE | 21 + assets/.gitignore | 1 + assets/logo.png | Bin 0 -> 196984 bytes composer.json | 96 + composer.lock | 8255 ++++++++++++++++++++++++ config/config.php | 3 + helpers.php | 14 + hooks/common.sh | 15 + hooks/pre-commit | 36 + hooks/pre-push | 16 + phpstan.neon.dist | 7 + phpunit.xml | 18 + pint.json | 8 + rector.php | 40 + release_tag.sh | 101 + src/Skeleton.php | 7 + tests/Pest.php | 41 + tests/TestCase.php | 10 + 23 files changed, 8876 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/unit-tests.yml create mode 100644 .github/workflows/update-changelog.yml create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 assets/.gitignore create mode 100644 assets/logo.png create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/config.php create mode 100644 helpers.php create mode 100755 hooks/common.sh create mode 100755 hooks/pre-commit create mode 100755 hooks/pre-push create mode 100644 phpstan.neon.dist create mode 100644 phpunit.xml create mode 100644 pint.json create mode 100644 rector.php create mode 100755 release_tag.sh create mode 100644 src/Skeleton.php create mode 100644 tests/Pest.php create mode 100644 tests/TestCase.php diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..a76dd83 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 + +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml new file mode 100644 index 0000000..bc97bd7 --- /dev/null +++ b/.github/workflows/unit-tests.yml @@ -0,0 +1,62 @@ +name: Unit Tests + +on: + pull_request: + push: + branches: + - master + +jobs: + unit-tests: + name: Run Unit Tests + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + php: [8.2] + dependency-version: [prefer-stable] + + steps: + # Check out the repository code + - name: Checkout + uses: actions/checkout@v4 + + # Set up the desired PHP version with extensions and coverage + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: dom, mbstring, zip + coverage: pcov + + # Determine the Composer cache directory + - name: Get Composer cache directory + id: composer-cache + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-files-dir)" >> $GITHUB_ENV + + # Cache both the Composer cache directory and the vendor directory + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: | + ${{ env.COMPOSER_CACHE_DIR }} + vendor + key: php-${{ matrix.php }}-deps-${{ hashFiles('composer.json', 'composer.lock') }} + restore-keys: | + php-${{ matrix.php }}-deps- + + - name: Install dependencies + run: composer install --prefer-dist --no-progress --no-suggest + + - name: Run Rector (Dry Run) + run: composer test:refactor + + - name: Run Lint Tests + run: composer test:lint + + - name: Run PHPStan + run: composer test:types + + - name: Run Pest Tests + run: composer test:unit diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml new file mode 100644 index 0000000..4d6e95c --- /dev/null +++ b/.github/workflows/update-changelog.yml @@ -0,0 +1,32 @@ +name: Update Changelog + +on: + release: + types: [published] + +permissions: + contents: write + +jobs: + update-changelog: + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: master + + - name: Update Changelog + uses: stefanzweifel/changelog-updater-action@v1 + with: + latest-version: ${{ github.event.release.name }} + release-notes: ${{ github.event.release.body }} + + - name: Commit updated CHANGELOG + uses: stefanzweifel/git-auto-commit-action@v5 + with: + branch: master + commit_message: Update CHANGELOG + file_pattern: CHANGELOG.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6bf176b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/vendor/ +/.idea/ +.phpunit.result.cache +.DS_Store diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b44f6c0 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,81 @@ +# Changelog + +All notable changes to `laravel package skeleton` will be documented in this file + +## v1.2.2 - 2024-06-16 + +**Full Changelog**: https://github.com/algoyounes/laravel-package-skeleton/compare/v1.2.1...v1.2.2 + +## v1.2.1 - 2024-06-16 + +**Full Changelog**: https://github.com/algoyounes/laravel-package-skeleton/compare/v1.2.0...v1.2.1 + +## v1.2.0 - 2024-06-16 + +### What's Changed + +* Feat: Implement automated changelog updates by @algoyounes in https://github.com/algoyounes/laravel-package-skeleton/pull/7 + +**Full Changelog**: https://github.com/algoyounes/laravel-package-skeleton/compare/v1.1.2...v1.2.0 + +## v1.1.1 - 2024-06-12 + +**What's Changed:** + +- **Tweak:** add helpers file for utility functions + +**Full Changelog:** [v1.1.0...v1.1.1](https://github.com/your-repository/compare/v1.1.0...v1.1.1) + + +--- + +## v1.1.0 - 2024-06-11 + +**What's Changed:** + +- **Feat:** Update build tools and configurations by [@algoyounes](https://github.com/algoyounes) in [#6](https://github.com/your-repository/pull/6) + +**Full Changelog:** [v1.0.4...v1.1.0](https://github.com/your-repository/compare/v1.0.4...v1.1.0) + + +--- + +## v1.0.4 - 2024-06-11 + +**Full Changelog:** [v1.0.3...v1.0.4](https://github.com/your-repository/compare/v1.0.3...v1.0.4) + + +--- + +## v1.0.3 - 2024-05-15 + +**What's Changed:** + +- **Feat:** Add git hooks for automation by [@algoyounes](https://github.com/algoyounes) in [#5](https://github.com/your-repository/pull/5) + +**Full Changelog:** [v1.0.1...v1.0.3](https://github.com/your-repository/compare/v1.0.1...v1.0.3) + +**Contributors:** + +- [@algoyounes](https://github.com/algoyounes) + + +--- + +## v1.0.1 - 2024-05-08 + +**What's Changed:** + +- **FEAT:** init PHP skeleton package by [@algoyounes](https://github.com/algoyounes) in [#1](https://github.com/your-repository/pull/1) +- **PATCH:** Composer > Update package name by [@algoyounes](https://github.com/algoyounes) in [#2](https://github.com/your-repository/pull/2) +- **feat:** Upgrade PHP to version 8.2 by [@algoyounes](https://github.com/algoyounes) in [#3](https://github.com/your-repository/pull/3) +- **Update:** GitHub Actions Workflow for Unit Tests by [@algoyounes](https://github.com/algoyounes) in [#4](https://github.com/your-repository/pull/4) + +**Full Changelog:** [v1.0.0...v1.0.1](https://github.com/your-repository/compare/v1.0.0...v1.0.1) + + +--- + +## 1.0.0 - 2024-05-08 + +- initial release diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9b15752 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Algo Younes + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/assets/.gitignore b/assets/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/assets/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c326766f4870a746928014f7b59efff1bcb1358e GIT binary patch literal 196984 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