diff --git a/.editorconfig b/.editorconfig index 75084693c..dc54cdef4 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,7 +13,7 @@ block_comment = * block_comment_end = */ [{*.php,*.js,*.scss}] -max_line_length = 120 +max_line_length = 160 [*.blade.php] max_line_length = 3000 diff --git a/.github/workflows/back-end.yml b/.github/workflows/back-end.yml index 320dbd920..bbf0080db 100644 --- a/.github/workflows/back-end.yml +++ b/.github/workflows/back-end.yml @@ -17,28 +17,6 @@ concurrency: cancel-in-progress: true jobs: - byte_level: - name: "0️⃣ Byte-level" - runs-on: "ubuntu-22.04" - timeout-minutes: 1 - steps: - - - name: "Checkout repository" - uses: "actions/checkout@v3" - - - name: "Check file permissions" - run: | - test "$(find ./ -type f -not -path './.git/*' -executable)" = "" - - - name: "Check for byte order mark (BOM)" - run: | - ! git grep --perl-regexp -I -e '^\xEF\xBB\xBF' - - - # https://html.spec.whatwg.org/multipage/named-characters.html - name: "Find non-printable ASCII characters" - run: | - ! LC_ALL=C.UTF-8 git grep --perl-regexp --line-number -e '[^ -~]' -- '*.php' - syntax_errors: name: "1️⃣ Syntax errors" runs-on: "ubuntu-22.04" @@ -55,23 +33,17 @@ jobs: - name: "Checkout repository" uses: "actions/checkout@v3" - - - name: "Search for conflict markers 🐌" - run: | - ! git grep --line-number -e '^\(<<<<<<<\s\|=======\s\|=======$\|>>>>>>>\s\||||||||\s\)' - name: "Search for invalid complex curly syntax 🐌" run: | ! git grep -e '\${[A-Z_a-z]' -- '*.php' '*.scss' - name: "Check source code for syntax errors" - run: "composer exec --no-interaction -- parallel-lint src/" - # @TODO Check template files for syntax errors + run: "composer exec --no-interaction -- parallel-lint src/ tests/" unit_tests: name: "2️⃣ Unit and functional tests" needs: - - "byte_level" - "syntax_errors" strategy: fail-fast: false @@ -127,7 +99,6 @@ jobs: static_analysis: name: "3️⃣ Static Analysis" needs: - - "byte_level" - "syntax_errors" runs-on: "ubuntu-22.04" timeout-minutes: 5 @@ -171,7 +142,6 @@ jobs: coding_standards: name: "4️⃣ Coding Standards" needs: - - "byte_level" - "syntax_errors" runs-on: "ubuntu-22.04" timeout-minutes: 5 @@ -187,16 +157,6 @@ jobs: - name: "Checkout repository" uses: "actions/checkout@v3" - - - name: "Check EditorConfig configuration" - run: "test -f .editorconfig" - - - name: "Check adherence to EditorConfig" - uses: "greut/eclint-action@v0" - - - name: "Look for TAB characters in the middle of the line 🐌" - run: | - ! git grep --perl-regexp --line-number -I '^(?!//)[^\t]+\t' - name: "Install dependencies" uses: "ramsey/composer-install@v2" @@ -213,52 +173,3 @@ jobs: name: "Annotate Pint results" if: "${{ failure() && steps.pint.outcome == 'failure' }}" run: "composer exec -- pint --test --format=checkstyle | cs2pr" - - - # Move TODO-s into GitHub issues! - name: "Search for TODO-s and FIXME-s 🐌" - run: | - ! git grep --extended-regexp --ignore-case '\b(TODO|FIXME)\b' -- ':!:*/back-end\.yml' - - - name: "Remove blank first lines and multiple blank lines 🐌" - run: | - git ls-files --cached -z -- ':(exclude,glob)**/yarn.lock' \ - | xargs --null -L 1 -- sed -i -e '/./,$!d' -e '/^$/N;/^\n$/D' - - - name: "Check differences to repository" - run: "git diff --exit-code" - - exported_files: - name: "5️⃣ Exported files" - needs: - - "byte_level" - - "syntax_errors" - runs-on: "ubuntu-22.04" - timeout-minutes: 1 - steps: - - - name: "Checkout repository" - uses: "actions/checkout@v3" - - - name: "Check for ignored files in the index 🐌" - run: | - IGNORED_FILES="$(git ls-files --cached --ignored --exclude-standard)" - test -z "${IGNORED_FILES}" - - - name: "Check exported files" - run: | - EXPECTED="LICENSE,README.md,composer.json,package.json" - CURRENT="$( - git archive HEAD \ - | tar --list --exclude="src" --exclude="src/*" \ - --exclude="config" --exclude="config/*" \ - --exclude="database" --exclude="database/*" \ - --exclude="public" --exclude="public/*" \ - --exclude="resources" --exclude="resources/*" \ - --exclude="routes" --exclude="routes/*" \ - --exclude="src" --exclude="src/*" \ - --exclude="stubs" --exclude="stubs/*" \ - | paste --serial --delimiters="," - )" - echo "CURRENT =${CURRENT}" - echo "EXPECTED=${EXPECTED}" - test "${CURRENT}" = "${EXPECTED}" diff --git a/.github/workflows/integrity.yml b/.github/workflows/integrity.yml new file mode 100644 index 000000000..df3f422af --- /dev/null +++ b/.github/workflows/integrity.yml @@ -0,0 +1,39 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow + +name: "Integrity" +# This workflow prevents earthquakes. + +on: + pull_request: null + push: + branches: + - "master" + +permissions: {} + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +jobs: + call_workflow_integrity: + name: "Integrity" + uses: "./.github/workflows/reusable-integrity.yml" + with: + not-printable-ascii-paths: >- + src/ + resources/ + tests/ + export-excludes: >- + --exclude="config" --exclude="config/*" + --exclude="database" --exclude="database/*" + --exclude="public" --exclude="public/*" + --exclude="resources" --exclude="resources/*" + --exclude="routes" --exclude="routes/*" + --exclude="src" --exclude="src/*" + --exclude="stubs" --exclude="stubs/*" + exported-paths: >- + LICENSE + README.md + composer.json + package.json diff --git a/.github/workflows/reusable-integrity.yml b/.github/workflows/reusable-integrity.yml new file mode 100644 index 000000000..3a2a06f88 --- /dev/null +++ b/.github/workflows/reusable-integrity.yml @@ -0,0 +1,169 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow + +name: "Shared Integrity" +# This action prevents earthquakes. + +on: + workflow_call: + inputs: + executables: + description: "List of executable files" + type: "string" + default: "" + required: false + not-printable-ascii-paths: + description: "Paths to be searched for characters outside the printable ASCII range" + type: "string" + default: "src/ tests/" + required: false + export-excludes: + description: "List of the expected exported directories" + type: "string" + default: "--exclude='src' --exclude='src/*'" + required: false + exported-paths: + description: "List of the expected exported files" + type: "string" + default: "LICENSE README.md composer.json" + required: false + +permissions: {} + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}-reusable-integrity" + cancel-in-progress: true + +jobs: + file: + name: "File" + runs-on: "ubuntu-22.04" + timeout-minutes: 1 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Check file permissions" + run: | + test "$( + git ls-files --stage \ + | grep -v '^100644' \ + | cut -c '51-' + )" = "${{ inputs.executables }}" + - + # https://github.com/greut/eclint/issues/6 + name: "Check for byte order mark (BOM)" + run: | + ! git grep --perl-regexp -I -e '^\xEF\xBB\xBF' + - + # https://html.spec.whatwg.org/multipage/named-characters.html + name: "Search for characters outside the printable ASCII range" + run: | + ! LC_ALL=C.UTF-8 git grep --perl-regexp --line-number -I -e '[^ -~]' \ + -- ${{ inputs.not-printable-ascii-paths }} + - + name: "Check EditorConfig configuration" + run: "test -f .editorconfig" + - + name: "Check adherence to EditorConfig" + uses: "greut/eclint-action@v0" + - + name: "Look for TAB characters in the middle of the line 🐌" + run: | + ! git grep --perl-regexp --line-number -I -e '^(?!//)[^\t]+\t' + - + name: "Look for multiple space characters in the middle of the line 🐌" + run: | + # Exclude docblocks + ! git grep --perl-regexp --line-number -I \ + -e '(?!^#)\S\s\s' --and --not -e ' \* @' \ + -- ':!:*.lock' ':!:*.md' ':!:.github/**.yml' ':!:public/build/' + - + # Move TODO-s into GitHub issues! + name: "Search for TODO-s and FIXME-s 🐌" + run: | + ! git grep --extended-regexp --ignore-case -I -e '\b(TODO|FIXME)\b' \ + -- ':!:.github/workflows/reusable-integrity.yml' ':!:.github/workflows/back-end.yml' + - + name: "Remove blank first lines and multiple blank lines 🐌" + run: | + # Exclude binary files, empty files and ones with linguist-generated attribute set + git grep --files-with-matches -I -e '.' \ + | git check-attr --stdin --all \ + | sed -n -e 's#^\(.\+\): linguist-generated: set$#":!:\1"#p' \ + | xargs -- git ls-files --cached -z -- \ + | xargs --null -n 1 -- sed -i -e '/./,$!d' -e '/^$/N;/^\n$/D' + - + name: "Check differences to repository" + run: "git diff --exit-code" + + cloc: + name: "Lines of Code" + runs-on: "ubuntu-22.04" + timeout-minutes: 1 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Count Lines of Code" + env: + GH_TOKEN: "${{ github.token }}" + run: | + mkdir -p "${{ runner.temp }}/cloc" + RELEASE_ASSET_URL="$( + # v1.98 + gh api /repos/AlDanial/cloc/releases/117882376 \ + --jq '."assets"[] | select(."name" | test("^cloc-.+\\.pl$")) | ."browser_download_url"' + )" + wget --secure-protocol=TLSv1_3 --max-redirect=1 --retry-on-host-error --retry-connrefused --tries=3 \ + --no-verbose --output-document="${{ runner.temp }}/cloc/cloc" "${RELEASE_ASSET_URL}" + { + git ls-files -- ':!:LICENSE' ':!:package-lock.json' >"${{ runner.temp }}/cloc/include-list" + echo '```' + perl "${{ runner.temp }}/cloc/cloc" --hide-rate \ + --list-file="${{ runner.temp }}/cloc/include-list" \ + --ignored="${{ runner.temp }}/cloc/.clocignored" + cat "${{ runner.temp }}/cloc/.clocignored" + echo '```' + } >>"${GITHUB_STEP_SUMMARY}" + + commit: + name: "Commit" + runs-on: "ubuntu-22.04" + timeout-minutes: 1 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Search for conflict markers 🐌" + run: | + ! git grep --line-number -e '^\(<<<<<<<\s\|=======\s\|=======$\|>>>>>>>\s\||||||||\s\)' + + git_archive: + name: "Git archive" + runs-on: "ubuntu-22.04" + timeout-minutes: 1 + steps: + - + name: "Checkout repository" + uses: "actions/checkout@v3" + - + name: "Check for ignored files in the index 🐌" + run: | + # Add negated files: ':!:path/to/negated' + IGNORED_FILES="$(git ls-files --cached --ignored --exclude-standard)" + test -z "${IGNORED_FILES}" + - + name: "Check exported files" + run: | + EXPECTED="${{ inputs.exported-paths }}" + CURRENT="$( + git archive HEAD \ + | tar --list ${{ inputs.export-excludes }} \ + | paste --serial --delimiters=" " + )" + echo "CURRENT =${CURRENT}" + echo "EXPECTED=${EXPECTED}" + test "${CURRENT}" = "${EXPECTED}" diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml index d7a738a8c..b09903638 100644 --- a/.github/workflows/spelling.yml +++ b/.github/workflows/spelling.yml @@ -2,7 +2,7 @@ name: "Spelling" -on: # yamllint disable-line rule:truthy +on: pull_request: null push: branches: diff --git a/resources/sass/config/_dark-colors.scss b/resources/sass/config/_dark-colors.scss index 1d48f9f7c..6f332e625 100644 --- a/resources/sass/config/_dark-colors.scss +++ b/resources/sass/config/_dark-colors.scss @@ -138,8 +138,8 @@ $colors: ( ), 'scrollbar': ( 'thumb-background': hsl(0 0% 100% / 15%), - 'thumb-background-hover': hsl(0 0% 100% / 25%), - 'track-background': hsl(0 0% 100% / 5%), + 'thumb-background-hover': hsl(0 0% 100% / 25%), + 'track-background': hsl(0 0% 100% / 5%), ), 'widget': ( 'icon-background': color.adjust($dark-color-black, $lightness: 5%), diff --git a/src/Console/Commands/ResourceMake.php b/src/Console/Commands/ResourceMake.php index 5ee57d674..2ac24db80 100644 --- a/src/Console/Commands/ResourceMake.php +++ b/src/Console/Commands/ResourceMake.php @@ -3,7 +3,6 @@ namespace Cone\Root\Console\Commands; use Illuminate\Console\GeneratorCommand; -use Illuminate\Support\Str; use Symfony\Component\Console\Input\InputOption; class ResourceMake extends GeneratorCommand diff --git a/src/RootApplicationServiceProvider.php b/src/RootApplicationServiceProvider.php index 86b34d2cc..77fc45395 100644 --- a/src/RootApplicationServiceProvider.php +++ b/src/RootApplicationServiceProvider.php @@ -2,7 +2,6 @@ namespace Cone\Root; -use Illuminate\Routing\Router; use Illuminate\Support\Facades\Gate; use Illuminate\Support\ServiceProvider; diff --git a/src/Widgets/Metric.php b/src/Widgets/Metric.php index cd3089263..e55fa137f 100644 --- a/src/Widgets/Metric.php +++ b/src/Widgets/Metric.php @@ -4,7 +4,6 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\App; -use Illuminate\Support\Facades\Redis; abstract class Metric extends Widget {