<?xml version="1.0"?>
<!-- See http://pear.php.net/manual/en/package.php.php-codesniffer.annotated-ruleset.php -->
<ruleset name="Drupal">
  <description>Drupal coding standard</description>
  <!-- All Drupal code files must be UTF-8 encoded and we treat them as such. -->
  <arg name="encoding" value="utf-8" />

  <rule ref="Internal.NoCodeFound">
    <!-- Empty files are fine, might be used for testing. -->
    <exclude-pattern>*</exclude-pattern>
  </rule>

  <rule ref="Drupal.Commenting.FileComment">
    <!-- Do not run this sniff on txt or yml files. -->
    <exclude-pattern>*.txt</exclude-pattern>
    <exclude-pattern>*.yml</exclude-pattern>
  </rule>
  <rule ref="Drupal.Commenting.FileComment.SpacingAfterComment">
    <!-- Do not run this sniff on template files. -->
    <exclude-pattern>*.tpl.php</exclude-pattern>
  </rule>
  <rule ref="Drupal.ControlStructures.ControlSignature">
    <!-- Do not run this sniff on template files. -->
    <exclude-pattern>*.tpl.php</exclude-pattern>
  </rule>
  <rule ref="Drupal.WhiteSpace.CloseBracketSpacing">
    <!-- Do not run this sniff on template files. -->
    <exclude-pattern>*.tpl.php</exclude-pattern>
  </rule>
  <rule ref="Drupal.WhiteSpace.ScopeIndent">
    <!-- Do not run this sniff on template files, as the indentation might follow
         the HTML -->
    <exclude-pattern>*.tpl.php</exclude-pattern>
  </rule>
  <rule ref="Drupal.WhiteSpace.ScopeClosingBrace">
    <!-- Do not run this sniff on template files, as the indentation might follow
         the HTML -->
    <exclude-pattern>*.tpl.php</exclude-pattern>
  </rule>

  <!-- Generic sniffs -->
  <rule ref="Generic.Arrays.DisallowLongArraySyntax" />
  <rule ref="Generic.CodeAnalysis.EmptyPHPStatement" />
  <rule ref="Generic.CodeAnalysis.UselessOverridingMethod" />
  <rule ref="Generic.ControlStructures.InlineControlStructure" />
  <rule ref="Generic.Files.ByteOrderMark" />
  <rule ref="Generic.Files.LineEndings" />
  <rule ref="Generic.Formatting.DisallowMultipleStatements" />
  <rule ref="Generic.Formatting.SpaceAfterCast" />
  <rule ref="Generic.Functions.FunctionCallArgumentSpacing">
    <!-- Already covered by Drupal.WhiteSpace.Comma.NoSpace. -->
    <exclude name="Generic.Functions.FunctionCallArgumentSpacing.NoSpaceAfterComma" />
  </rule>
  <rule ref="Generic.NamingConventions.ConstructorName" />
  <rule ref="Generic.NamingConventions.InterfaceNameSuffix" />
  <rule ref="Generic.NamingConventions.TraitNameSuffix" />
  <rule ref="Generic.NamingConventions.UpperCaseConstantName" />
  <rule ref="Generic.PHP.DeprecatedFunctions" />
  <rule ref="Generic.PHP.DisallowShortOpenTag">
    <!-- Do not run this sniff on .yml files -->
    <exclude-pattern>*.yml</exclude-pattern>
  </rule>
  <rule ref="Generic.PHP.LowerCaseKeyword" />
  <rule ref="Generic.PHP.UpperCaseConstant" />
  <rule ref="Generic.Strings.UnnecessaryStringConcat">
    <properties>
      <property name="allowMultiline" value="true" />
    </properties>
  </rule>
  <rule ref="Generic.WhiteSpace.DisallowTabIndent" />
  <rule ref="Generic.WhiteSpace.LanguageConstructSpacing" />

  <!-- PEAR sniffs -->
  <rule ref="PEAR.Files.IncludingFile">
    <!-- Disable some error messages that we do not want. -->
    <exclude name="PEAR.Files.IncludingFile.UseInclude" />
    <exclude name="PEAR.Files.IncludingFile.UseIncludeOnce" />
    <exclude name="PEAR.Files.IncludingFile.UseRequire" />
    <exclude name="PEAR.Files.IncludingFile.UseRequireOnce" />
  </rule>
  <rule ref="PEAR.Functions.FunctionCallSignature">
    <exclude name="PEAR.Functions.FunctionCallSignature.CloseBracketLine" />
    <exclude name="PEAR.Functions.FunctionCallSignature.ContentAfterOpenBracket" />
    <exclude name="PEAR.Functions.FunctionCallSignature.EmptyLine" />
    <exclude name="PEAR.Functions.FunctionCallSignature.Indent" />
    <exclude name="PEAR.Functions.FunctionCallSignature.OpeningIndent" />
    <!-- Disable some error messages that we already cover. -->
    <exclude name="PEAR.Functions.FunctionCallSignature.SpaceAfterOpenBracket" />
    <exclude name="PEAR.Functions.FunctionCallSignature.SpaceBeforeCloseBracket" />
  </rule>
  <rule ref="PEAR.Functions.ValidDefaultValue" />

  <!-- PSR-2 sniffs -->
  <rule ref="PSR2.Classes.PropertyDeclaration">
    <!-- Already covered by Drupal.Classes.PropertyDeclaration.VarUsed. -->
    <exclude name="PSR2.Classes.PropertyDeclaration.VarUsed" />
  </rule>
  <rule ref="PSR2.ControlStructures.ElseIfDeclaration" />
  <rule ref="PSR2.ControlStructures.SwitchDeclaration">
    <!-- Disable some error messages that we do not want. -->
    <exclude name="PSR2.ControlStructures.SwitchDeclaration.BodyOnNextLineCASE" />
    <exclude name="PSR2.ControlStructures.SwitchDeclaration.BreakIndent" />
  </rule>
  <rule ref="PSR2.Methods.MethodDeclaration" />
  <rule ref="PSR2.Namespaces.NamespaceDeclaration" />
  <rule ref="PSR2.Namespaces.UseDeclaration" />

  <!-- SlevomatCodingStandard sniffs -->
  <rule ref="SlevomatCodingStandard.Classes.BackedEnumTypeSpacing" />
  <rule ref="SlevomatCodingStandard.Commenting.ForbiddenComments">
    <properties>
      <property name="forbiddenCommentPatterns" type="array">
        <!-- Catch comments ending in 2 dots, but leave comments ending in 3
         dots alone. -->
        <element value="/(?&lt;!\.)\.\.(?!\.)$/" />
      </property>
    </properties>
  </rule>
  <rule ref="SlevomatCodingStandard.ControlStructures.NewWithParentheses" />
  <rule ref="SlevomatCodingStandard.ControlStructures.RequireNullCoalesceOperator" />
  <rule ref="SlevomatCodingStandard.Namespaces.UnusedUses" />
  <rule ref="SlevomatCodingStandard.Namespaces.UseDoesNotStartWithBackslash" />
  <rule ref="SlevomatCodingStandard.Namespaces.UseFromSameNamespace" />
  <rule ref="SlevomatCodingStandard.PHP.ShortList" />
  <rule ref="SlevomatCodingStandard.TypeHints.DeclareStrictTypes">
    <exclude name="SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing" />
    <properties>
      <property name="linesCountBeforeDeclare" value="1" />
      <property name="linesCountAfterDeclare" value="1" />
      <property name="spacesCountAroundEqualsSign" value="0" />
    </properties>
  </rule>
  <rule ref="SlevomatCodingStandard.TypeHints.NullableTypeForNullDefaultValue" />

  <rule ref="Squiz.Arrays.ArrayDeclaration">
    <!-- Disable some error messages that we do not want. -->
    <exclude name="Squiz.Arrays.ArrayDeclaration.CloseBraceNotAligned" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.CloseBraceNewLine" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.DoubleArrowNotAligned" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.FirstValueNoNewline" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.IndexNoNewline" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.KeyNotAligned" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.MultiLineNotAllowed" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.NoComma" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.NoCommaAfterLast" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.NotLowerCase" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.SingleLineNotAllowed" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.ValueNotAligned" />
    <exclude name="Squiz.Arrays.ArrayDeclaration.ValueNoNewline" />
  </rule>

  <rule ref="Squiz.Arrays.ArrayBracketSpacing" />

  <rule ref="Squiz.Classes.ClassFileName">
    <!-- Disable class name to file name matching in Test files. -->
    <exclude-pattern>*/tests/*/*(Test|TestBase).php</exclude-pattern>
  </rule>
  <rule ref="Squiz.ControlStructures.ForEachLoopDeclaration">
    <!-- Disable some error messages that we already cover. -->
    <exclude name="Squiz.ControlStructures.ForEachLoopDeclaration.AsNotLower" />
    <exclude name="Squiz.ControlStructures.ForEachLoopDeclaration.SpaceAfterOpen" />
    <exclude name="Squiz.ControlStructures.ForEachLoopDeclaration.SpaceBeforeClose" />
  </rule>
  <rule ref="Squiz.ControlStructures.ForLoopDeclaration">
    <!-- Disable some error messages that we already cover. -->
    <exclude name="Squiz.ControlStructures.ForLoopDeclaration.SpacingAfterOpen" />
    <exclude name="Squiz.ControlStructures.ForLoopDeclaration.SpacingBeforeClose" />
  </rule>

  <rule ref="Squiz.ControlStructures.SwitchDeclaration">
    <!-- Disable some error messages that we do not want. -->
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.BreakIndent" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.CaseIndent" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.CloseBraceAlign" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.DefaultIndent" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.DefaultNoBreak" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.EmptyCase" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.EmptyDefault" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.MissingDefault" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.SpacingAfterCase" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.SpacingAfterDefaultBreak" />
    <exclude name="Squiz.ControlStructures.SwitchDeclaration.SpacingBeforeBreak" />
  </rule>

  <rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing">
    <properties>
      <property name="equalsSpacing" value="1" />
    </properties>
    <exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.NoSpaceBeforeArg" />
  </rule>

  <rule ref="Squiz.PHP.LowercasePHPFunctions" />
  <rule ref="Squiz.PHP.NonExecutableCode" />
  <rule ref="Squiz.Strings.ConcatenationSpacing">
    <properties>
      <property name="spacing" value="1" />
      <property name="ignoreNewlines" value="true" />
    </properties>
  </rule>
  <rule ref="Squiz.WhiteSpace.FunctionSpacing">
    <properties>
      <property name="spacing" value="1" />
    </properties>
  </rule>
  <rule ref="Squiz.WhiteSpace.OperatorSpacing">
    <properties>
      <property name="ignoreNewlines" value="true" />
    </properties>
  </rule>
  <rule ref="Squiz.WhiteSpace.ScopeKeywordSpacing" />
  <rule ref="Squiz.WhiteSpace.SemicolonSpacing" />
  <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace" />

  <rule ref="Zend.Files.ClosingTag">
    <!-- Do not run this sniff on template files. -->
    <exclude-pattern>*.tpl.php</exclude-pattern>
  </rule>

  <!-- Ignore various version control directories. -->
  <exclude-pattern>*/\.git/*</exclude-pattern>
  <exclude-pattern>*/\.svn/*</exclude-pattern>
  <exclude-pattern>*/\.hg/*</exclude-pattern>
  <exclude-pattern>*/\.bzr/*</exclude-pattern>
</ruleset>
