##### General

- Home
- Downloads
- Javadocs
- Mailing Lists
- Bug Tracker
- SourceForge Project
- GitHub Project

##### Running

- Ant Task Usage
- Command-Line
- Run as a Test
- Other Tools/Frameworks

##### Using

- Creating a RuleSet
- Creating a Rule
- Configuring Rules
- Starter RuleSet (All)

##### Report Types

- HTML Report
- XML Report
- Text and IDE Reports

##### Sample Reports

- Sample HTML Report
- Sample XML Report

##### Rules

- Rule Index
- Basic Rules
- Braces Rules
- Concurrency Rules
- Convention Rules
- Design Rules
- DRY Rules
- Enhanced Rules
- Exceptions Rules
- Formatting Rules
- Generic Rules
- Grails Rules
- Groovyism Rules
- Imports Rules
- JDBC Rules
- JUnit Rules
- Logging Rules
- Naming Rules
- Size/Complexity Rules
- Security Rules
- Serialization Rules
- Unnecessary Rules
- Unused Rules

##### Developing

- Developer Guide

##### Project Documentation

- Project Information
- Project Reports

## DRY (Don't Repeat Yourself) Rules ("rulesets/dry.xml")

These rules check for duplicate code, enforcing the DRY (Don't Repeat Yourself) principle.

### DuplicateListLiteral Rule

Since CodeNarc 0.16

This rule checks for duplicate List literals within the current class. This rule only checks for Lists where values are all constants or literals.

Code containing duplicate List literals can usually be improved by declaring the List as a constant field.

By default, the rule does not analyze test files. This rule sets the default value of the doNotApplyToFilesMatching property to ignore file names ending in 'Test.groovy', 'Tests.groovy' or 'TestCase.groovy'.

Examples of violations:

          def var1 = [1, null, Boolean.FALSE, 'x', true]
          def var2 = [1, null, Boolean.FALSE, 'x', true]        // violation

          def var1 = [1, [3, 4]]
          def var2 = [1, [3,4]]     // violation

          def var1 = [123, [3, 4, [x:99], 5]]
          def var2 = [99, [3, 4, [x:99], 5]]        // violation [3, 4, [x:99], 5]

Examples of non-violations:

        def name
        def var1 = [name, 'b', 'c']
        def var2 = [name, 'b', 'c']   // not a violation; name is a variable

        def var1 = [1, 7+5]
        def var2 = [1, 7+5]      // not a violation; contains a non-constant/literal expression

#### Notes

- This rule does not search across several files at once, only in the current file, and only within the current class.
- You can suppress the error by annotating a class or method with the `@SuppressWarnings('DuplicateListLiteral')` annotation.

### DuplicateMapLiteral Rule

Since CodeNarc 0.16

This rule checks for duplicate Map literals within the current class. This rule only checks for Maps where the keys and values are all constants or literals.

Code containing duplicate Map literals can usually be improved by declaring the Map as a constant field.

By default, the rule does not analyze test files. This rule sets the default value of the doNotApplyToFilesMatching property to ignore file names ending in 'Test.groovy', 'Tests.groovy' or 'TestCase.groovy'.

Examples of violations:

          def var1 = [a:1, b:null, c:Boolean.FALSE, d:'x', e:true]
          def var2 = [a:1, b:null, c:Boolean.FALSE, d:'x', e:true]      // violation

          def var1 = [a:1, b:[x:3,y:4]]
          def var2 = [a:1, b:[x:3,y:4]]     // violation

          def var1 = [a:1, b:[3,4]]
          def var2 = [a:1, b:[3,4]]     // violation

          def var1 = [null:1, 'b':2, (Boolean.FALSE):3, (4):4, (true):5]
          def var2 = [null:1, 'b':2, (Boolean.FALSE):3, (4):4, (true):5]    // violation

Examples of non-violations:

        def name
        def var1 = [(name):1, b:1, c:1]
        def var2 = [(name):1, b:1, c:1]   // not a violation; name is a variable

        def var1 = [a:1, b:['x', name]]
        def var2 = [a:1, b:['x', name]]   // not a violation; name is a variable

        def var1 = [a:7+5]
        def var2 = [a:7+5]      // not a violation; contains a non-constant/literal expression

#### Notes

- This rule does not search across several files at once, only in the current file, and only within the current class.
- You can suppress the error by annotating a class or method with the `@SuppressWarnings('DuplicateMapLiteral')` annotation.

### DuplicateNumberLiteral Rule

Since CodeNarc 0.11

This rule checks for duplicate number literals within the current class.

Code containing duplicate Number literals can usually be improved by declaring the Number as a constant field.

By default, the rule does not analyze test files. This rule sets the default value of the doNotApplyToFilesMatching property to ignore file names ending in 'Test.groovy', 'Tests.groovy' or 'TestCase.groovy'.

Property | Description | Default Value
ignoreNumbers | The optional comma-separated list of numbers that should be ignored (i.e., not cause a violation). | `0,1`

#### Notes

- This rule does not search across several files at once, only in the current file, and only within the current class.
- You can suppress the error by annotating a class or method with the `@SuppressWarnings('DuplicateNumberLiteral')` annotation.

### DuplicateStringLiteral Rule

Since CodeNarc 0.11

This rule checks for duplicate String literals within the current class.

Code containing duplicate String literals can usually be improved by declaring the String as a constant field.

By default, the rule does not analyze test files. This rule sets the default value of the doNotApplyToFilesMatching property to ignore file names ending in 'Test.groovy', 'Tests.groovy' or 'TestCase.groovy'.

Property | Description | Default Value
ignoreStrings | The optional comma-separated list of Strings that should be ignored (i.e., not cause a violation). | `''` (empty string)

#### Notes

- This rule does not search across several files at once, only in the current file, and only within the current class.
- You can suppress the error by annotating a class or method with the `@SuppressWarnings('DuplicateStringLiteral')` annotation.