<?xml version="1.0"?>
<ruleset
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="vendor/squizlabs/php_codesniffer/phpcs.xsd"
>
    <arg name="basepath" value="."/>
    <arg name="extensions" value="php"/>
    <arg name="parallel" value="80"/>
    <arg name="cache" value=".phpcs-cache"/>
    <arg name="colors"/>
    <arg value="nps"/>

    <file>src/</file>
    <file>tests/</file>

    <rule ref="Doctrine">
        <exclude name="Generic.Formatting.SpaceAfterNot"/>
        <exclude name="Generic.Formatting.MultipleStatementAlignment"/>
        <exclude name="PEAR.Functions.ValidDefaultValue.NotAtEnd"/>


        <exclude name="Squiz.Arrays.ArrayDeclaration.KeySpecified"/>
        <exclude name="Squiz.Commenting.FunctionComment.SpacingAfterParamType"/>
        <exclude name="SlevomatCodingStandard.Functions.StaticClosure"/>

        <exclude name="SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming"/>
        <exclude name="SlevomatCodingStandard.Classes.SuperfluousInterfaceNaming"/>
        <exclude name="SlevomatCodingStandard.Classes.SuperfluousExceptionNaming"/>

        <exclude name="SlevomatCodingStandard.ControlStructures.DisallowYodaComparison.DisallowedYodaComparison"/>
        <exclude name="SlevomatCodingStandard.ControlStructures.AssignmentInCondition.AssignmentInCondition"/>
        <exclude name="SlevomatCodingStandard.ControlStructures.EarlyExit"/>

        <exclude name="SlevomatCodingStandard.Commenting.RequireOneLineDocComment.MultiLineDocComment"/>
        <exclude name="SlevomatCodingStandard.Commenting.RequireOneLinePropertyDocComment"/>

        <exclude name="SlevomatCodingStandard.ControlStructures.RequireNullCoalesceEqualOperator.RequiredNullCoalesceEqualOperator"/>

        <exclude name="SlevomatCodingStandard.Classes.SuperfluousTraitNaming.SuperfluousSuffix"/>

        <exclude name="SlevomatCodingStandard.Functions.RequireTrailingCommaInCall.MissingTrailingComma"/>

        <exclude name="SlevomatCodingStandard.PHP.RequireNowdoc.RequiredNowdoc"/>

        <exclude name="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint"/>
        <exclude name="SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingNativeTypeHint"/>

        <exclude name="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingTraversableTypeHintSpecification"/>
        <exclude name="SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingTraversableTypeHintSpecification"/>
        <exclude name="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingTraversableTypeHintSpecification"/>
    </rule>

    <rule ref="SlevomatCodingStandard.ControlStructures.RequireYodaComparison"/>

    <rule ref="SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly">
        <properties>
            <property name="allowFallbackGlobalConstants" type="boolean" value="true"/>
            <property name="allowFallbackGlobalFunctions" type="boolean" value="true"/>
            <property name="allowFullyQualifiedGlobalClasses" type="boolean" value="true"/>
            <property name="allowFullyQualifiedGlobalConstants" type="boolean" value="true"/>
            <property name="allowFullyQualifiedGlobalFunctions" type="boolean" value="true"/>
            <property name="allowFullyQualifiedNameForCollidingClasses" type="boolean" value="false"/>
            <property name="allowFullyQualifiedNameForCollidingConstants" type="boolean" value="false"/>
            <property name="allowFullyQualifiedNameForCollidingFunctions" type="boolean" value="false"/>
            <property name="searchAnnotations" type="boolean" value="true"/>
        </properties>
    </rule>

     <rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHintSpacing">
        <properties>
            <property name="spacesCountBeforeColon" value="0"/>
        </properties>
    </rule>

    <rule ref="PSR1.Classes.ClassDeclaration.MultipleClasses">
        <exclude-pattern>tests/*</exclude-pattern>
    </rule>

    <rule ref="PSR2.Classes.PropertyDeclaration.Multiple">
        <exclude-pattern>tests/*</exclude-pattern>
    </rule>

    <rule ref="Squiz.Classes.ClassFileName.NoMatch">
        <exclude-pattern>tests/*</exclude-pattern>
    </rule>

    <rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint">
        <exclude-pattern>tests/*</exclude-pattern>
    </rule>

    <rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingAnyTypeHint">
        <exclude-pattern>tests/*</exclude-pattern>
    </rule>

    <rule ref="SlevomatCodingStandard.TypeHints.PropertyTypeHint.MissingAnyTypeHint">
        <exclude-pattern>tests/*</exclude-pattern>
    </rule>

    <rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint">
        <exclude-pattern>tests/*</exclude-pattern>
    </rule>

    <rule ref="Squiz.NamingConventions.ValidVariableName.NotCamelCaps">
        <exclude-pattern>tests/*</exclude-pattern>
    </rule>

    <rule ref="SlevomatCodingStandard.Commenting.DocCommentSpacing">
        <properties>
            <property name="annotationsGroups" type="array">
                <element value="
                    @Annotation,
                    @Target,
                "/>
                <element value="
                    @internal,
                    @deprecated,
                "/>
                <element value="@author"/>
                <element value="
                    @link,
                    @see,
                    @uses,
                "/>
                <element value="
                    @Serializer\,
                    @ORM\,
                    @ODM\,
                "/>
                <element value="@param"/>
                <element value="@return"/>
                <element value="@throws"/>
            </property>
        </properties>
    </rule>
</ruleset>
