1<!-- 2 ~ Licensed to the Apache Software Foundation (ASF) under one or more 3 ~ contributor license agreements. See the NOTICE file distributed with 4 ~ this work for additional information regarding copyright ownership. 5 ~ The ASF licenses this file to You under the Apache License, Version 2.0 6 ~ (the "License"); you may not use this file except in compliance with 7 ~ the License. You may obtain a copy of the License at 8 ~ 9 ~ http://www.apache.org/licenses/LICENSE-2.0 10 ~ 11 ~ Unless required by applicable law or agreed to in writing, software 12 ~ distributed under the License is distributed on an "AS IS" BASIS, 13 ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ~ See the License for the specific language governing permissions and 15 ~ limitations under the License. 16 --> 17<!-- 18 19If you wish to turn off checking for a section of code, you can put a comment in the source 20before and after the section, with the following syntax: 21 22 // scalastyle:off 23 ... // stuff that breaks the styles 24 // scalastyle:on 25 26You can also disable only one rule, by specifying its rule id, as specified in: 27 http://www.scalastyle.org/rules-0.7.0.html 28 29 // scalastyle:off no.finalize 30 override def finalize(): Unit = ... 31 // scalastyle:on no.finalize 32 33This file is divided into 3 sections: 34 (1) rules that we enforce. 35 (2) rules that we would like to enforce, but haven't cleaned up the codebase to turn on yet 36 (or we need to make the scalastyle rule more configurable). 37 (3) rules that we don't want to enforce. 38--> 39 40<scalastyle> 41 <name>Scalastyle standard configuration</name> 42 43 <!-- ================================================================================ --> 44 <!-- rules we enforce --> 45 <!-- ================================================================================ --> 46 47 <check level="error" class="org.scalastyle.file.FileTabChecker" enabled="true"></check> 48 49 <check level="error" class="org.scalastyle.file.HeaderMatchesChecker" enabled="true"> 50 <parameters> 51 <parameter name="header"><![CDATA[/* 52 * Licensed to the Apache Software Foundation (ASF) under one or more 53 * contributor license agreements. See the NOTICE file distributed with 54 * this work for additional information regarding copyright ownership. 55 * The ASF licenses this file to You under the Apache License, Version 2.0 56 * (the "License"); you may not use this file except in compliance with 57 * the License. You may obtain a copy of the License at 58 * 59 * http://www.apache.org/licenses/LICENSE-2.0 60 * 61 * Unless required by applicable law or agreed to in writing, software 62 * distributed under the License is distributed on an "AS IS" BASIS, 63 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 64 * See the License for the specific language governing permissions and 65 * limitations under the License. 66 */]]></parameter> 67 </parameters> 68 </check> 69 70 <check level="error" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check> 71 72 <check level="error" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check> 73 74 <check level="error" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check> 75 76 <check level="error" class="org.scalastyle.file.FileLineLengthChecker" enabled="true"> 77 <parameters> 78 <parameter name="maxLineLength"><![CDATA[100]]></parameter> 79 <parameter name="tabSize"><![CDATA[2]]></parameter> 80 <parameter name="ignoreImports">true</parameter> 81 </parameters> 82 </check> 83 84 <check level="error" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true"> 85 <parameters><parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter></parameters> 86 </check> 87 88 <check level="error" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true"> 89 <parameters><parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter></parameters> 90 </check> 91 92 <check level="error" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true"> 93 <parameters><parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter></parameters> 94 </check> 95 96 <check level="error" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true"> 97 <parameters><parameter name="maxParameters"><![CDATA[10]]></parameter></parameters> 98 </check> 99 100 <check level="error" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check> 101 102 <check level="error" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check> 103 104 <check level="error" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check> 105 106 <check level="error" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check> 107 108 <check level="error" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true"> 109 <parameters> 110 <parameter name="singleLineAllowed"><![CDATA[true]]></parameter> 111 <parameter name="doubleLineAllowed"><![CDATA[true]]></parameter> 112 </parameters> 113 </check> 114 115 <check level="error" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"></check> 116 117 <check level="error" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check> 118 119 <check customId="nonascii" level="error" class="org.scalastyle.scalariform.NonASCIICharacterChecker" enabled="true"></check> 120 121 <check level="error" class="org.scalastyle.scalariform.SpaceAfterCommentStartChecker" enabled="true"></check> 122 123 <check level="error" class="org.scalastyle.scalariform.EnsureSingleSpaceBeforeTokenChecker" enabled="true"> 124 <parameters> 125 <parameter name="tokens">ARROW, EQUALS, ELSE, TRY, CATCH, FINALLY, LARROW, RARROW</parameter> 126 </parameters> 127 </check> 128 129 <check level="error" class="org.scalastyle.scalariform.EnsureSingleSpaceAfterTokenChecker" enabled="true"> 130 <parameters> 131 <parameter name="tokens">ARROW, EQUALS, COMMA, COLON, IF, ELSE, DO, WHILE, FOR, MATCH, TRY, CATCH, FINALLY, LARROW, RARROW</parameter> 132 </parameters> 133 </check> 134 135 <!-- ??? usually shouldn't be checked into the code base. --> 136 <check level="error" class="org.scalastyle.scalariform.NotImplementedErrorUsage" enabled="true"></check> 137 138 <!-- As of SPARK-7558, all tests in Spark should extend o.a.s.SparkFunSuite instead of FunSuite directly --> 139 <check customId="funsuite" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true"> 140 <parameters><parameter name="regex">^FunSuite[A-Za-z]*$</parameter></parameters> 141 <customMessage>Tests must extend org.apache.spark.SparkFunSuite instead.</customMessage> 142 </check> 143 144 <!-- As of SPARK-7977 all printlns need to be wrapped in '// scalastyle:off/on println' --> 145 <check customId="println" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true"> 146 <parameters><parameter name="regex">^println$</parameter></parameters> 147 <customMessage><![CDATA[Are you sure you want to println? If yes, wrap the code block with 148 // scalastyle:off println 149 println(...) 150 // scalastyle:on println]]></customMessage> 151 </check> 152 153 <check customId="visiblefortesting" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> 154 <parameters><parameter name="regex">@VisibleForTesting</parameter></parameters> 155 <customMessage><![CDATA[ 156 @VisibleForTesting causes classpath issues. Please note this in the java doc instead (SPARK-11615). 157 ]]></customMessage> 158 </check> 159 160 <check customId="runtimeaddshutdownhook" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> 161 <parameters><parameter name="regex">Runtime\.getRuntime\.addShutdownHook</parameter></parameters> 162 <customMessage><![CDATA[ 163 Are you sure that you want to use Runtime.getRuntime.addShutdownHook? In most cases, you should use 164 ShutdownHookManager.addShutdownHook instead. 165 If you must use Runtime.getRuntime.addShutdownHook, wrap the code block with 166 // scalastyle:off runtimeaddshutdownhook 167 Runtime.getRuntime.addShutdownHook(...) 168 // scalastyle:on runtimeaddshutdownhook 169 ]]></customMessage> 170 </check> 171 172 <check customId="mutablesynchronizedbuffer" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> 173 <parameters><parameter name="regex">mutable\.SynchronizedBuffer</parameter></parameters> 174 <customMessage><![CDATA[ 175 Are you sure that you want to use mutable.SynchronizedBuffer? In most cases, you should use 176 java.util.concurrent.ConcurrentLinkedQueue instead. 177 If you must use mutable.SynchronizedBuffer, wrap the code block with 178 // scalastyle:off mutablesynchronizedbuffer 179 mutable.SynchronizedBuffer[...] 180 // scalastyle:on mutablesynchronizedbuffer 181 ]]></customMessage> 182 </check> 183 184 <check customId="classforname" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> 185 <parameters><parameter name="regex">Class\.forName</parameter></parameters> 186 <customMessage><![CDATA[ 187 Are you sure that you want to use Class.forName? In most cases, you should use Utils.classForName instead. 188 If you must use Class.forName, wrap the code block with 189 // scalastyle:off classforname 190 Class.forName(...) 191 // scalastyle:on classforname 192 ]]></customMessage> 193 </check> 194 195 <check customId="awaitresult" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> 196 <parameters><parameter name="regex">Await\.result</parameter></parameters> 197 <customMessage><![CDATA[ 198 Are you sure that you want to use Await.result? In most cases, you should use ThreadUtils.awaitResult instead. 199 If you must use Await.result, wrap the code block with 200 // scalastyle:off awaitresult 201 Await.result(...) 202 // scalastyle:on awaitresult 203 If your codes use ThreadLocal and may run in threads created by the user, use ThreadUtils.awaitResultInForkJoinSafely instead. 204 ]]></customMessage> 205 </check> 206 207 <!-- As of SPARK-9613 JavaConversions should be replaced with JavaConverters --> 208 <check customId="javaconversions" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true"> 209 <parameters><parameter name="regex">JavaConversions</parameter></parameters> 210 <customMessage>Instead of importing implicits in scala.collection.JavaConversions._, import 211 scala.collection.JavaConverters._ and use .asScala / .asJava methods</customMessage> 212 </check> 213 214 <check customId="commonslang2" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true"> 215 <parameters><parameter name="regex">org\.apache\.commons\.lang\.</parameter></parameters> 216 <customMessage>Use Commons Lang 3 classes (package org.apache.commons.lang3.*) instead 217 of Commons Lang 2 (package org.apache.commons.lang.*)</customMessage> 218 </check> 219 220 <check level="error" class="org.scalastyle.scalariform.ImportOrderChecker" enabled="true"> 221 <parameters> 222 <parameter name="groups">java,scala,3rdParty,spark</parameter> 223 <parameter name="group.java">javax?\..*</parameter> 224 <parameter name="group.scala">scala\..*</parameter> 225 <parameter name="group.3rdParty">(?!org\.apache\.spark\.).*</parameter> 226 <parameter name="group.spark">org\.apache\.spark\..*</parameter> 227 </parameters> 228 </check> 229 230 <check level="error" class="org.scalastyle.scalariform.DisallowSpaceBeforeTokenChecker" enabled="true"> 231 <parameters> 232 <parameter name="tokens">COMMA</parameter> 233 </parameters> 234 </check> 235 236 <!-- SPARK-3854: Single Space between ')' and '{' --> 237 <check customId="SingleSpaceBetweenRParenAndLCurlyBrace" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> 238 <parameters><parameter name="regex">\)\{</parameter></parameters> 239 <customMessage><![CDATA[ 240 Single Space between ')' and `{`. 241 ]]></customMessage> 242 </check> 243 244 <check customId="NoScalaDoc" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> 245 <parameters><parameter name="regex">(?m)^(\s*)/[*][*].*$(\r|)\n^\1 [*]</parameter></parameters> 246 <customMessage>Use Javadoc style indentation for multiline comments</customMessage> 247 </check> 248 249 <check customId="OmitBracesInCase" level="error" class="org.scalastyle.file.RegexChecker" enabled="true"> 250 <parameters><parameter name="regex">case[^\n>]*=>\s*\{</parameter></parameters> 251 <customMessage>Omit braces in case clauses.</customMessage> 252 </check> 253 254 <!-- SPARK-16877: Avoid Java annotations --> 255 <check customId="OverrideJavaCase" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true"> 256 <parameters><parameter name="regex">^Override$</parameter></parameters> 257 <customMessage>override modifier should be used instead of @java.lang.Override.</customMessage> 258 </check> 259 260 <check level="error" class="org.scalastyle.scalariform.DeprecatedJavaChecker" enabled="true"></check> 261 262 <!-- ================================================================================ --> 263 <!-- rules we'd like to enforce, but haven't cleaned up the codebase yet --> 264 <!-- ================================================================================ --> 265 266 <!-- We cannot turn the following two on, because it'd fail a lot of string interpolation use cases. --> 267 <!-- Ideally the following two rules should be configurable to rule out string interpolation. --> 268 <check level="error" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="false"></check> 269 <check level="error" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="false"></check> 270 271 <!-- This breaks symbolic method names so we don't turn it on. --> 272 <!-- Maybe we should update it to allow basic symbolic names, and then we are good to go. --> 273 <check level="error" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="false"> 274 <parameters> 275 <parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter> 276 </parameters> 277 </check> 278 279 <!-- Should turn this on, but we have a few places that need to be fixed first --> 280 <check level="error" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check> 281 282 <!-- ================================================================================ --> 283 <!-- rules we don't want --> 284 <!-- ================================================================================ --> 285 286 <check level="error" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="false"> 287 <parameters><parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter></parameters> 288 </check> 289 290 <!-- We want the opposite of this: NewLineAtEofChecker --> 291 <check level="error" class="org.scalastyle.file.NoNewLineAtEofChecker" enabled="false"></check> 292 293 <!-- This one complains about all kinds of random things. Disable. --> 294 <check level="error" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="false"></check> 295 296 <!-- We use return quite a bit for control flows and guards --> 297 <check level="error" class="org.scalastyle.scalariform.ReturnChecker" enabled="false"></check> 298 299 <!-- We use null a lot in low level code and to interface with 3rd party code --> 300 <check level="error" class="org.scalastyle.scalariform.NullChecker" enabled="false"></check> 301 302 <!-- Doesn't seem super big deal here ... --> 303 <check level="error" class="org.scalastyle.scalariform.NoCloneChecker" enabled="false"></check> 304 305 <!-- Doesn't seem super big deal here ... --> 306 <check level="error" class="org.scalastyle.file.FileLengthChecker" enabled="false"> 307 <parameters><parameter name="maxFileLength">800></parameter></parameters> 308 </check> 309 310 <!-- Doesn't seem super big deal here ... --> 311 <check level="error" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="false"> 312 <parameters><parameter name="maxTypes">30</parameter></parameters> 313 </check> 314 315 <!-- Doesn't seem super big deal here ... --> 316 <check level="error" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="false"> 317 <parameters><parameter name="maximum">10</parameter></parameters> 318 </check> 319 320 <!-- Doesn't seem super big deal here ... --> 321 <check level="error" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="false"> 322 <parameters><parameter name="maxLength">50</parameter></parameters> 323 </check> 324 325 <!-- Not exactly feasible to enforce this right now. --> 326 <!-- It is also infrequent that somebody introduces a new class with a lot of methods. --> 327 <check level="error" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="false"> 328 <parameters><parameter name="maxMethods"><![CDATA[30]]></parameter></parameters> 329 </check> 330 331 <!-- Doesn't seem super big deal here, and we have a lot of magic numbers ... --> 332 <check level="error" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="false"> 333 <parameters><parameter name="ignore">-1,0,1,2,3</parameter></parameters> 334 </check> 335 336</scalastyle> 337