From e935ead1fca090ff5f355be4740523436af3a47d Mon Sep 17 00:00:00 2001 From: metalbote <metalbote@2809357.no-reply.drupal.org> Date: Thu, 2 Jan 2020 14:02:04 +0200 Subject: [PATCH] Issue #3079231 by metalbote: Add code quality tests and analysis --- .phpmd.xml | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ .phpqa.yml | 66 +++++++++++++++++++++++++++++++++++++++++++++ build.xml | 10 +++++++ 3 files changed, 154 insertions(+) create mode 100644 .phpmd.xml create mode 100644 .phpqa.yml diff --git a/.phpmd.xml b/.phpmd.xml new file mode 100644 index 00000000..79c17910 --- /dev/null +++ b/.phpmd.xml @@ -0,0 +1,78 @@ +<?xml version="1.0"?> +<ruleset xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PMD Ruleset for Drupal" xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> +<description> + A PMD Ruleset for Drupal coding standards. +</description> + +<!-- + Include each rule explicitly so we know what we have. + @see https://github.com/phpmd/phpmd/blob/master/src/main/resources/rulesets/ +--> + +<!-- Clean Code --> +<!-- +These don't align with Drupal standards, so they are excluded. +@todo Static calls are hard to test and extend, is there a way to whitelist the ones that are OK? +<rule ref="rulesets/cleancode.xml/BooleanArgumentFlag"/> +<rule ref="rulesets/cleancode.xml/ElseExpression"/> +<rule ref="rulesets/cleancode.xml/StaticAccess"/> +--> + +<!-- Code Size --> +<rule ref="rulesets/codesize.xml/CyclomaticComplexity"/> +<rule ref="rulesets/codesize.xml/NPathComplexity"/> +<rule ref="rulesets/codesize.xml/ExcessiveMethodLength"/> +<rule ref="rulesets/codesize.xml/ExcessiveClassLength"/> +<rule ref="rulesets/codesize.xml/ExcessiveParameterList"/> +<rule ref="rulesets/codesize.xml/ExcessivePublicCount"/> +<rule ref="rulesets/codesize.xml/TooManyFields"/> + +<!-- Controversial --> +<rule ref="rulesets/controversial.xml/Superglobals"/> +<!-- +These checks do not need to be included since PHPCS will check for style. +<rule ref="rulesets/controversial.xml/CamelCaseClassName"/> +<rule ref="rulesets/controversial.xml/CamelCasePropertyName"/> +<rule ref="rulesets/controversial.xml/CamelCaseMethodName"/> +<rule ref="rulesets/controversial.xml/CamelCaseParameterName"/> +<rule ref="rulesets/controversial.xml/CamelCaseVariableName"/> +--> + +<!-- Design --> +<rule ref="rulesets/design.xml/ExitExpression"/> +<rule ref="rulesets/design.xml/EvalExpression"/> +<rule ref="rulesets/design.xml/GotoStatement"/> +<rule ref="rulesets/design.xml/NumberOfChildren"/> +<rule ref="rulesets/design.xml/DepthOfInheritance"/> +<rule ref="rulesets/design.xml/CouplingBetweenObjects"/> +<rule ref="rulesets/design.xml/DevelopmentCodeFragment"/> + +<!-- Naming --> +<rule ref="rulesets/naming.xml/ShortVariable"> + <properties> + <!-- Allow $id and $op as a variable name. --> + <property name="exceptions" description="Comma-separated list of exceptions" value="id,op"/> + </properties> +</rule> +<rule ref="rulesets/naming.xml/LongVariable"> + <properties> + <!-- Bump variable length to a more reasonable number. --> + <property name="maximum" description="The variable length reporting threshold" value="35"/> + </properties> +</rule> +<rule ref="rulesets/naming.xml/ShortMethodName"/> +<rule ref="rulesets/naming.xml/ConstructorWithNameAsEnclosingClass"/> +<rule ref="rulesets/naming.xml/ConstantNamingConventions"/> +<rule ref="rulesets/naming.xml/BooleanGetMethodName"/> + +<!-- Unused Code --> +<rule ref="rulesets/unusedcode.xml/UnusedPrivateField"/> +<!-- <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable"/> --> +<rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod"/> +<!-- +Hooks often have unused parameters, so ignore this warning. +@todo is there a way to allow unused parameters in hooks but not elsewhere? +<rule ref="rulesets/unusedcode.xml/UnusedFormalParameter"/> +--> + +</ruleset> \ No newline at end of file diff --git a/.phpqa.yml b/.phpqa.yml new file mode 100644 index 00000000..2229e009 --- /dev/null +++ b/.phpqa.yml @@ -0,0 +1,66 @@ +# ============================================================================== +# Default common config for Phpqa. +# +# For more options see: +# https://github.com/EdgedesignCZ/phpqa/blob/master/.phpqa.yml +# ============================================================================== + +phpqa: + analyzedDirs: ./ + buildDir: ./tests/code-quality + ignoredDirs: ".gitlab-ci,.git,.idea,bin,docroot,node_modules,private,.tests/assets,vendor,web" + ignoredFiles: "" + report: true + # verbose: true + # execution: no-parallel + tools: + - phpmetrics + - phploc + - phpcs + - phpmd + - pdepend + - phpcpd + - phpstan + - security-checker + extensions: + - php + - inc + - module + - install + - test + - profile + - theme + - info + - txt + - md + +phpcs: + standard: Drupal + ignoreWarnings: true + # https://github.com/squizlabs/PHP_CodeSniffer/wiki/Reporting + reports: + cli: + - full + file: + checkstyle: checkstyle.xml + +pdepend: +# coverageReport: build/coverage-clover.xml + +phpmd: + standard: ./.phpmd.xml + +phpstan: + level: 3 + # https://github.com/phpstan/phpstan#configuration + standard: phpstan.neon + +phpcpd: + minLines: 5 + minTokens: 70 + +phpmetrics: + config: null + git: false + + diff --git a/build.xml b/build.xml index b497e3d0..d8e740a5 100644 --- a/build.xml +++ b/build.xml @@ -4,6 +4,7 @@ <property name="drush" value="${project.basedir}/bin/drush" /> <property name="composer" value="/usr/local/bin/composer" /> <property name="npm" value="/usr/local/bin/npm" /> + <property name="phpqa" value="${project.basedir}/bin/phpqa"/> <property name="rsync" value="/usr/bin/rsync" /> <property name="db.type" value="mysql" /> <property name="db.host" value="localhost" /> @@ -32,6 +33,7 @@ <echo message="Found Drush: ${drush}" /> <echo message="Found Composer: ${composer}" /> + <echo message="Found phpqa: ${phpqa}" /> <echo message="Found NPM: ${npm}" /> <echo message="Found rsync: ${rsync}" /> </target> @@ -60,6 +62,14 @@ <filesync destinationDir="." rsyncPath="${rsync}" sourceDir="${profile}/" verbose="false" exclude="libraries,modules/contrib,behat.local.yml" /> </target> + <!-- Prepares the behat tests environment. --> + <target name="code-quality-check" depends="env"> + <exec executable="${phpqa}" passthru="true"> + <arg value="--analyzedDirs=./"/> + <arg value="--buildDir=./tests/code-quality"/> + </exec> + </target> + <!-- Prepares the docroot for installation via the UI. --> <target name="preinstall" depends="uninstall"> <if> -- GitLab