diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 404d457..cd15956 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,175 +6,12 @@ on: - 'master' - 'refs/heads/v[0-9]+.[0-9]+.[0-9]+' pull_request: +## This workflow needs the `pull-request` permissions to work for the package diffing +## Refs: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#permissions +permissions: + pull-requests: write + contents: read jobs: - package-name: - name: Package Name - runs-on: ubuntu-latest - needs: - - lint-json - outputs: - package-name: ${{ steps.package-name.outputs.package-name }} - steps: - - uses: actions/checkout@v4 - - id: package-name - run: | - printf "::set-output name=package-name::[\"%s\"]" $(docker run --rm -v "`pwd`:`pwd`" jess/jq jq -r -c '.name' "${GITHUB_WORKSPACE}/composer.json") - supported-versions-matrix: - name: Supported Versions Matrix - runs-on: ubuntu-latest - needs: - - lint-yaml - - lint-json - outputs: - version: ${{ steps.supported-versions-matrix.outputs.version }} - upcoming: ${{ steps.supported-versions-matrix.outputs.upcoming }} - steps: - - uses: actions/checkout@v4 - - id: supported-versions-matrix - uses: WyriHaximus/github-action-composer-php-versions-in-range@v1 - with: - upcomingReleases: true - supported-checks-matrix: - name: Supported Checks Matrix - runs-on: ubuntu-latest - needs: - - lint-yaml - outputs: - check: ${{ steps.supported-checks-matrix.outputs.check }} - steps: - - uses: actions/checkout@v4 - - id: supported-checks-matrix - name: Generate check - run: | - printf "Checks found: %s\r\n" $(make task-list-ci) - printf "::set-output name=check::%s" $(make task-list-ci) - can-require: - name: Test we can require "${{ matrix.package-name }}" on PHP ${{ matrix.php }} - strategy: - fail-fast: false - matrix: - php: ${{ fromJson(needs.supported-versions-matrix.outputs.version) }} - package-name: ${{ fromJson(needs.package-name.outputs.package-name) }} - needs: - - lint-yaml - - lint-json - - package-name - - supported-versions-matrix - runs-on: ubuntu-latest - container: - image: ghcr.io/wyrihaximusnet/php:${{ matrix.php }}-nts-buster-dev-root - steps: - - uses: actions/checkout@v4 - with: - path: checked_out_package - - name: Set Up composer.json - run: | - echo "{\"repositories\": [{\"name\": \"${{ matrix.package-name }}\",\"type\": \"path\",\"url\": \"./checked_out_package\"}]}" > composer.json - - name: Require package - if: needs.supported-versions-matrix.outputs.upcoming != matrix.php - run: | - composer require "${{ matrix.package-name }}:dev-${GITHUB_SHA}" --no-progress --ansi --no-interaction --prefer-dist -o || composer require "${{ matrix.package-name }}:dev-${GITHUB_REF_NAME}" --no-progress --ansi --no-interaction --prefer-dist -o - qa: - name: Run ${{ matrix.check }} on PHP ${{ matrix.php }} with ${{ matrix.composer }} dependency preference - strategy: - fail-fast: false - matrix: - php: ${{ fromJson(needs.supported-versions-matrix.outputs.version) }} - composer: [lowest, locked, highest] - check: ${{ fromJson(needs.supported-checks-matrix.outputs.check) }} - needs: - - lint-yaml - - lint-json - - supported-checks-matrix - - supported-versions-matrix - runs-on: ubuntu-latest - container: - image: ghcr.io/wyrihaximusnet/php:${{ matrix.php }}-nts-buster-dev-root - steps: - - uses: actions/checkout@v4 - - uses: ramsey/composer-install@v2 - with: - dependency-versions: ${{ matrix.composer }} - - name: Fetch Tags - run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* || true - if: matrix.check == 'backward-compatibility-check' - - run: make ${{ matrix.check }} || true - if: needs.supported-versions-matrix.outputs.upcoming == matrix.php - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_RUN_LOCALLY: ${{ secrets.COVERALLS_RUN_LOCALLY }} - - run: make ${{ matrix.check }} - if: needs.supported-versions-matrix.outputs.upcoming != matrix.php - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_RUN_LOCALLY: ${{ secrets.COVERALLS_RUN_LOCALLY }} - tests-directly-on-os: - name: Run tests on PHP ${{ matrix.php }} with ${{ matrix.composer }} dependency preference (${{ matrix.os }}) - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, windows-latest, macos-latest] - php: ${{ fromJson(needs.supported-versions-matrix.outputs.version) }} - composer: [lowest, locked, highest] - needs: - - lint-yaml - - lint-json - - supported-checks-matrix - - supported-versions-matrix - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v4 - - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php }} - coverage: pcov - extensions: intl, sodium - - uses: ramsey/composer-install@v2 - with: - dependency-versions: ${{ matrix.composer }} - - run: make unit-testing-raw || true - if: needs.supported-versions-matrix.outputs.upcoming == matrix.php - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_RUN_LOCALLY: ${{ secrets.COVERALLS_RUN_LOCALLY }} - - run: make unit-testing-raw - if: needs.supported-versions-matrix.outputs.upcoming != matrix.php - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_RUN_LOCALLY: ${{ secrets.COVERALLS_RUN_LOCALLY }} - lint-yaml: - name: Lint YAML - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: yaml-lint - uses: ibiqlik/action-yamllint@v3 - with: - config_data: | - extends: default - ignore: | - /.git/ - rules: - line-length: disable - document-start: disable - truthy: disable - lint-json: - name: Lint JSON - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: json-syntax-check - uses: limitusus/json-syntax-check@v2 - with: - pattern: "\\.json$" - check-mark: - name: ✔️ - needs: - - lint-yaml - - lint-json - - can-require - - qa - - tests-directly-on-os - runs-on: ubuntu-latest - steps: - - run: echo "✔️" + ci: + name: Continuous Integration + uses: WyriHaximus/github-workflows/.github/workflows/package.yaml@main diff --git a/.github/workflows/composer-diff.yaml b/.github/workflows/composer-diff.yaml deleted file mode 100644 index d644bd7..0000000 --- a/.github/workflows/composer-diff.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: Composer Diff -on: - ## To make this workflow work in the simplest way possible, without a PAT or juggling information between, we need to - ## run it with permissions as if it was already merged. - ## Refs: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request_target - ## Refs: https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ - ## Refs: https://twitter.com/WyriHaximus/status/1393679576828686340 - pull_request_target: - types: - - opened - - synchronize - - reopened -## This workflow needs the `pull-request` permissions to work -## Refs: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#permissions -permissions: - pull-requests: write - contents: read -jobs: - comment-composer-lock-diff: - name: Comment composer.lock diff - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 0 - - name: Comment composer.lock diff - uses: WyriHaximus/github-action-composer.lock-diff@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/craft-release.yaml b/.github/workflows/craft-release.yaml deleted file mode 100644 index eb069da..0000000 --- a/.github/workflows/craft-release.yaml +++ /dev/null @@ -1,55 +0,0 @@ -name: Create Release -env: - MILESTONE: ${{ github.event.milestone.title }} -on: - milestone: - types: - - closed -jobs: - generate-changelog: - name: Generate Changelog - runs-on: ubuntu-latest - outputs: - changelog: ${{ steps.changelog.outputs.changelog }} - steps: - - name: Generate changelog - uses: WyriHaximus/github-action-jwage-changelog-generator@v1 - id: changelog - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - milestone: ${{ env.MILESTONE }} - labels: "Bug 🐞,Dependabot 🤖,Feature 🏗,Enhancement ✨" - - name: Show changelog - run: echo "${CHANGELOG}" - env: - CHANGELOG: ${{ steps.changelog.outputs.changelog }} - create-release: - name: Create Release - needs: - - generate-changelog - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - env: - CHANGELOG: ${{ needs.generate-changelog.outputs.changelog }} - - run: | - echo -e "${MILESTONE_DESCRIPTION}\r\n\r\n${CHANGELOG}" > release-${{ env.MILESTONE }}-release-message.md - cat release-${{ env.MILESTONE }}-release-message.md - release_message=$(cat release-${{ env.MILESTONE }}-release-message.md) - release_message="${release_message//'%'/'%25'}" - release_message="${release_message//$'\n'/'%0A'}" - release_message="${release_message//$'\r'/'%0D'}" - echo "::set-output name=release_message::$release_message" - id: releasemessage - env: - MILESTONE_DESCRIPTION: ${{ github.event.milestone.description }} - CHANGELOG: ${{ needs.generate-changelog.outputs.changelog }} - - name: Create Release with Changelog - uses: ncipollo/release-action@v1 - with: - tag: ${{ env.MILESTONE }} - body: ${{ steps.releasemessage.outputs.release_message }} - draft: false - prerelease: false - token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/markdown-check-links.yaml b/.github/workflows/markdown-check-links.yaml deleted file mode 100644 index 2efeb87..0000000 --- a/.github/workflows/markdown-check-links.yaml +++ /dev/null @@ -1,14 +0,0 @@ -name: Check Markdown links - -on: - push: - pull_request: - -jobs: - markdown-link-check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: gaurav-nelson/github-action-markdown-link-check@v1 - with: - config-file: etc/ci/markdown-link-checker.json diff --git a/.github/workflows/release-managment.yaml b/.github/workflows/release-managment.yaml new file mode 100644 index 0000000..d125036 --- /dev/null +++ b/.github/workflows/release-managment.yaml @@ -0,0 +1,26 @@ +name: Release Management +on: + pull_request: + types: + - opened + - labeled + - unlabeled + - synchronize + - reopened + - milestoned + - demilestoned + - ready_for_review + milestone: + types: + - closed +permissions: + contents: write + issues: write + pull-requests: write +jobs: + release-managment: + name: Create Release + uses: WyriHaximus/github-workflows/.github/workflows/package-release-managment.yaml@main + with: + milestone: ${{ github.event.milestone.title }} + description: ${{ github.event.milestone.title }} diff --git a/.github/workflows/set-milestone-on-pr.yaml b/.github/workflows/set-milestone-on-pr.yaml deleted file mode 100644 index bc1f48f..0000000 --- a/.github/workflows/set-milestone-on-pr.yaml +++ /dev/null @@ -1,102 +0,0 @@ -name: Set Milestone -on: - pull_request: - types: - - assigned - - opened - - synchronize - - reopened - - edited - - ready_for_review - - review_requested -env: - INITIAL_TAG: 1.0.0 - FALLBACK_TAG: not_found - DEPENDABOT_APP_ID: 49699333 -jobs: - set-milestone: - name: Set Milestone - if: github.event.pull_request.milestone == null - runs-on: ubuntu-latest - outputs: - check: ${{ steps.generate-checks-strategy.outputs.check }} - steps: - - uses: actions/checkout@v4 - - name: 'Get Previous tag' - id: previoustag - uses: "WyriHaximus/github-action-get-previous-tag@v1" - with: - fallback: ${{ env.FALLBACK_TAG }} - - name: 'Get next versions' - id: semvers - if: steps.previoustag.outputs.tag != env.FALLBACK_TAG - uses: "WyriHaximus/github-action-next-semvers@v1" - with: - version: ${{ steps.previoustag.outputs.tag }} - - name: 'Decide which version fits this PR' - id: decidedversion - run: | - if [ "${PREVIOUS_TAG}" = "${FALLBACK_TAG}" ]; then - printf "::set-output name=version::%s" "${INITIAL_TAG}" - exit 0 - fi - - if [ "$(jq '.sender.id' -r ${GITHUB_EVENT_PATH})" = "${DEPENDABOT_APP_ID}" ]; then - printf "::set-output name=version::%s" "${PATCH}" - exit 0 - fi - - composer install --no-progress --ansi --no-interaction --prefer-dist -o -q - - if ! (./vendor/bin/roave-backward-compatibility-check); then - printf "::set-output name=version::%s" "${MAJOR}" - exit 0 - fi - - printf "::set-output name=version::%s" "${MINOR}" - env: - PREVIOUS_TAG: ${{ steps.previoustag.outputs.tag }} - MAJOR: ${{ steps.semvers.outputs.major }} - MINOR: ${{ steps.semvers.outputs.minor }} - PATCH: ${{ steps.semvers.outputs.patch }} - - name: 'Set Milestone through Chores.Dev' - uses: "chores-dev/set-milestone-action@main" - with: - milestone: ${{ steps.decidedversion.outputs.version }} - - name: 'Get Milestones' - uses: "WyriHaximus/github-action-get-milestones@master" - id: milestones - env: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - - run: printf "::set-output name=number::%s" $(printenv MILESTONES | jq --arg MILESTONE $(printenv MILESTONE) '.[] | select(.title == $MILESTONE) | .number') - id: querymilestone - env: - MILESTONES: ${{ steps.milestones.outputs.milestones }} - MILESTONE: ${{ steps.decidedversion.outputs.version }} - - name: 'Create Milestone' - if: steps.querymilestone.outputs.number == '' - id: createmilestone - uses: "WyriHaximus/github-action-create-milestone@v1" - with: - title: ${{ steps.decidedversion.outputs.version }} - env: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - - name: 'Select found or created Milestone' - id: selectmilestone - run: | - if [ $(echo ${QUERY_NUMBER} | wc -c) -eq 1 ] ; then - printf "::set-output name=number::%s" "${CREATED_NUMBER}" - exit 0 - fi - - printf "::set-output name=number::%s" "${QUERY_NUMBER}" - env: - CREATED_NUMBER: ${{ steps.createmilestone.outputs.number }} - QUERY_NUMBER: ${{ steps.querymilestone.outputs.number }} - - name: 'Set Milestone' - uses: "WyriHaximus/github-action-set-milestone@master" - with: - issue_number: ${{ github.event.pull_request.number }} - milestone_number: ${{ steps.selectmilestone.outputs.number }} - env: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/Makefile b/Makefile index 580e9a1..7601e27 100644 --- a/Makefile +++ b/Makefile @@ -5,9 +5,10 @@ SHELL=bash COMPOSER_SHOW_EXTENSION_LIST=$(shell composer show -t | grep -o "\-\-\(ext-\).\+" | sort | uniq | cut -d- -f4- | tr -d '\n' | grep . | sed '/^$$/d' | xargs | sed -e 's/ /, /g' | tr -cd '[:alnum:],' | sed 's/.$$//') SLIM_DOCKER_IMAGE=$(shell php -r 'echo count(array_intersect(["gd", "vips"], explode(",", "${COMPOSER_SHOW_EXTENSION_LIST}"))) > 0 ? "" : "-slim";') -COMPOSER_CACHE_DIR=$(shell composer config --global cache-dir -q || echo ${HOME}/.composer-php/cache) PHP_VERSION:=$(shell docker run --rm -v "`pwd`:`pwd`" jess/jq jq -r -c '.config.platform.php' "`pwd`/composer.json" | php -r "echo str_replace('|', '.', explode('.', implode('|', explode('.', stream_get_contents(STDIN), 2)), 2)[0]);") -COMPOSER_CONTAINER_CACHE_DIR=$(shell docker run --rm -it "ghcr.io/wyrihaximusnet/php:${PHP_VERSION}-nts-alpine${SLIM_DOCKER_IMAGE}-dev" composer config --global cache-dir -q || echo ${HOME}/.composer-php/cache) +CONTAINER_NAME=$(shell echo "ghcr.io/wyrihaximusnet/php:${PHP_VERSION}-nts-alpine${SLIM_DOCKER_IMAGE}-dev") +COMPOSER_CACHE_DIR=$(shell composer config --global cache-dir -q || echo ${HOME}/.composer-php/cache) +COMPOSER_CONTAINER_CACHE_DIR=$(shell docker run --rm -it ${CONTAINER_NAME} composer config --global cache-dir -q || echo ${HOME}/.composer-php/cache) ifneq ("$(wildcard /.you-are-in-a-wyrihaximus.net-php-docker-image)","") IN_DOCKER=TRUE @@ -22,7 +23,7 @@ else -v "`pwd`:`pwd`" \ -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" \ -w "`pwd`" \ - "ghcr.io/wyrihaximusnet/php:${PHP_VERSION}-nts-alpine${SLIM_DOCKER_IMAGE}-dev" + ${CONTAINER_NAME} endif ifneq (,$(findstring icrosoft,$(shell cat /proc/version))) @@ -31,13 +32,13 @@ else THREADS=$(shell nproc) endif -all: ## Runs everything ### - @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "###" | awk 'BEGIN {FS = ":.*?## "}; {printf "%s\n", $$1}' | xargs --open-tty $(MAKE) +all: ## Runs everything #### + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "####" | awk 'BEGIN {FS = ":.*?## "}; {printf "%s\n", $$1}' | xargs --open-tty $(MAKE) syntax-php: ## Lint PHP syntax $(DOCKER_RUN) vendor/bin/parallel-lint --exclude vendor . -cs-fix: ## Fix any automatically fixable code style issues +cs-fix: ## Fix any automatically fixable code style issues ### $(DOCKER_RUN) vendor/bin/phpcbf --parallel=$(THREADS) --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(DOCKER_RUN) vendor/bin/phpcbf --parallel=$(THREADS) --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(DOCKER_RUN) vendor/bin/phpcbf --parallel=$(THREADS) --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml -vvvv cs: ## Check the code for code style issues @@ -53,21 +54,21 @@ unit-testing: ## Run tests $(DOCKER_RUN) vendor/bin/phpunit --colors=always -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml $(DOCKER_RUN) test -n "$(COVERALLS_REPO_TOKEN)" && test -n "$(COVERALLS_RUN_LOCALLY)" && test -f ./var/tests-unit-clover-coverage.xml && vendor/bin/php-coveralls -v --coverage_clover ./build/logs/clover.xml --json_path ./var/tests-unit-clover-coverage-upload.json || true -unit-testing-raw: ## Run tests ### +unit-testing-raw: ## Run tests #### php vendor/phpunit/phpunit/phpunit --colors=always -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml test -n "$(COVERALLS_REPO_TOKEN)" && test -n "$(COVERALLS_RUN_LOCALLY)" && test -f ./var/tests-unit-clover-coverage.xml && ./vendor/bin/php-coveralls -v --coverage_clover ./build/logs/clover.xml --json_path ./var/tests-unit-clover-coverage-upload.json || true mutation-testing: ## Run mutation testing $(DOCKER_RUN) vendor/bin/roave-infection-static-analysis-plugin --ansi --log-verbosity=all --threads=$(THREADS) --psalm-config etc/qa/psalm.xml || (cat ./var/infection.log && false) -mutation-testing-raw: ## Run mutation testing ### +mutation-testing-raw: ## Run mutation testing #### php vendor/roave/infection-static-analysis-plugin/bin/roave-infection-static-analysis-plugin --ansi --log-verbosity=all --threads=$(THREADS) --psalm-config etc/qa/psalm.xml || (cat ./var/infection.log && false) composer-require-checker: ## Ensure we require every package used in this package directly $(DOCKER_RUN) vendor/bin/composer-require-checker --ignore-parse-errors --ansi -vvv --config-file=./etc/qa/composer-require-checker.json composer-unused: ## Ensure we don't require any package we don't use in this package directly - $(DOCKER_RUN) vendor/bin/composer-unused --ansi + $(DOCKER_RUN) vendor/bin/composer-unused --ansi --configuration=./etc/qa/composer-unused.php composer-install: ## Install dependencies $(DOCKER_RUN) composer install --no-progress --ansi --no-interaction --prefer-dist -o @@ -78,12 +79,21 @@ backward-compatibility-check: ## Check code for backwards incompatible changes backward-compatibility-check-raw: ## Check code for backwards incompatible changes, doesn't ignore the failure ### $(DOCKER_RUN) vendor/bin/roave-backward-compatibility-check -shell: ## Provides Shell access in the expected environment ### - $(DOCKER_RUN) ash +shell: ## Provides Shell access in the expected environment #### + $(DOCKER_RUN) bash + +install: ## Install dependencies #### + $(DOCKER_RUN) composer install + +update: ## Update dependencies #### + $(DOCKER_RUN) composer update -W + +outdated: ## Show outdated dependencies #### + $(DOCKER_RUN) composer outdated -task-list-ci: ## CI: Generate a JSON array of jobs to run, matches the commands run when running `make (|all)` ### +task-list-ci: ## CI: Generate a JSON array of jobs to run, matches the commands run when running `make (|all)` #### @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "###" | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "%s\n", $$1}' | jq --raw-input --slurp -c 'split("\n")| .[0:-1]' -help: ## Show this help ### +help: ## Show this help #### @printf "\033[33mUsage:\033[0m\n make [target]\n\n\033[33mTargets:\033[0m\n" @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[32m%-32s\033[0m %s\n", $$1, $$2}' | tr -d '#' diff --git a/composer.json b/composer.json index eb98a35..3bcf732 100644 --- a/composer.json +++ b/composer.json @@ -42,21 +42,14 @@ }, "sort-packages": true }, - "extra": { - "unused": [ - "bentools/iterable-functions", - "psr/simple-cache", - "react/async", - "react/cache", - "thecodingmachine/safe" - ] - }, "scripts": { "post-install-cmd": [ - "composer normalize" + "composer normalize", + "composer update --lock --no-scripts" ], "post-update-cmd": [ - "composer normalize" + "composer normalize", + "composer update --lock --no-scripts" ] } } diff --git a/composer.lock b/composer.lock index e93973b..b89cd8a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d6980dd674c9d3eeb751338a8c35b0f9", + "content-hash": "13c60f6081553a318981677153ce7d76", "packages": [ { "name": "bentools/iterable-functions", diff --git a/etc/qa/composer-unused.php b/etc/qa/composer-unused.php new file mode 100644 index 0000000..5d4cedd --- /dev/null +++ b/etc/qa/composer-unused.php @@ -0,0 +1,12 @@ + - + ../../tests/ - - + + ../../src/ - - + + - +