Quality

Maintaining code quality and managing static analysis.

Grunt Drupal Tasks makes a point of easing management of good coding practices by building code quality checks into the default build process, and applying several best-of-breed tools to evaluate code changes.

  • The grunt validate task runs the same operation the build process executes.
  • The grunt analyze task runs the same, along with the PHP Mess Detector, and
  • outputs all results in checkstyle XML format for consumption by Jenkins or
  • other reporting tools.

If you are interested in applying validation against files changed in your git repository, read more on how Grunt Drupal Tasks can manage your Git Hooks.

Validate Settings

The validate task runs eslint, phpcs, phplint against all custom code. If a theme has it’s own validate operation configured for grunt, it will skip eslint.

validate.ignoreError: Set to true to prevent failing the build if code quality validation fails (which also prevents other tasks from executing).

eslint

Example of eslint configuration:

"eslint": {
  "dir": [
    '<%= config.srcPaths.drupal %>/themes/*/js/**/*.js',
    '<%= config.srcPaths.drupal %>/{modules,profiles,libraries}/**/*.js'
  ]
},

eslint: To enable eslint, set to true to use default options or an object with the following optional settings.

eslint.configFile: The path to the eslint config file to use. If no value is specified, then .eslintrc in the project root is used.

eslint.dir: An array of glob patterns to include/exclude files for review by eslint. The following is used by default:

PHPLint

phplint.dir: An array of globbing patterns which phplint should include or exclude from PHP code syntax validation.

"phplint": {
  "dir": [
    '<%= config.srcPaths.drupal %>/sites/**/*.{php,inc}',
    '<%= config.srcPaths.drupal %>/themes/*/template.php',
    '<%= config.srcPaths.drupal %>/themes/*/templates/**/*.php',
    '<%= config.srcPaths.drupal %>/themes/*/includes/**/*.{inc,php}',
    '<%= config.srcPaths.drupal %>/{modules,profiles,libraries,static}/**/*.{php,module,inc,install,profile}',
    '!<%= config.srcPaths.drupal %>/{modules,profiles,libraries,static}/**/*.{box,pages_default,views_default,panelizer,strongarm}.inc',
    '!<%= config.srcPaths.drupal %>/{modules,profiles,libraries,static}/**/*.features.*inc',
    '!<%= config.srcPaths.drupal %>/{modules,profiles,libraries,static}/**/vendor/**'
  ]
}

PHPCS

phpcs.path: The path to the PHPCS executable.

phpcs.standard: The PHPCS coding standard to use. The example composer.json installs the Drupal Coder’s standard, the path of which is shown above.

phpcs.dir: An array of globbing pattern where phpcs should search for files. This can be used to replace the defaults supplied by grunt-drupal-tasks.

This example placed in the Gruntconfig.json file ignores directories named “pattern-lab” and a “bower_components” in addition to the defaults that come with grunt-drupal-tasks:

{
  "phpcs": {
    "path": "vendor/bin/phpcs",
    "dir": [
      '<%= config.srcPaths.drupal %>/{modules,profiles,libraries,static}/**/*.{php,module,inc,install,profile}',
      '!<%= config.srcPaths.drupal %>/{modules,profiles,libraries,static}/**/*.{box,pages_default,views_default,panelizer,strongarm}.inc',
      '!<%= config.srcPaths.drupal %>/{modules,profiles,libraries,static}/**/*.features.*inc',
      '!<%= config.srcPaths.drupal %>/{modules,profiles,libraries,static}/**/vendor/**',
      '!<%= config.srcPaths.drupal %>/{modules,profiles,libraries,static}/**/*.tpl.php'
    ]
  }
}

If there is no phpcs key in the configuration, the system will assume you are not using PHPCS and will suppress it from the system.

The formal coding standards for PHPTemplate files (ending in .tpl.php) seem to be rarely followed or enforced. By default we skip PHPCS processing of these files.

Analyze Settings

In addition to all the behaviors under the Validate section, Analyze adds additional reporting that does not make sense as part of the build process, such as tools that are too time-consuming to run on a regular basis.

PHP Mess Detector (PHPMD)

This tool is less focused on codified practice, and more on the architectural implications of code complexity, though there is some overlap in the rulesets.

{
  "phpmd": {
    "configPath": "phpmd.xml",
    "path": "bin/phpmd"
    "excludePaths": [
      "bower_components",
      "node_modules"
    ]
  }
}

phpmd.configPath: The configuration file to use with PHPMD. Defaults to phpmd.xml.

phpmd.excludePaths: An array of string path patterns that should be skipped by PHPMD.

phpmd.path: The path to the PHPMD executable.

If there is no phpmd key in the configuration, the system will assume you are not using PHPMD and will suppress it from the system.