0001 <!--
0002 ~ Licensed to the Apache Software Foundation (ASF) under one or more
0003 ~ contributor license agreements. See the NOTICE file distributed with
0004 ~ this work for additional information regarding copyright ownership.
0005 ~ The ASF licenses this file to You under the Apache License, Version 2.0
0006 ~ (the "License"); you may not use this file except in compliance with
0007 ~ the License. You may obtain a copy of the License at
0008 ~
0009 ~ http://www.apache.org/licenses/LICENSE-2.0
0010 ~
0011 ~ Unless required by applicable law or agreed to in writing, software
0012 ~ distributed under the License is distributed on an "AS IS" BASIS,
0013 ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0014 ~ See the License for the specific language governing permissions and
0015 ~ limitations under the License.
0016 -->
0017 <!--
0018
0019 If you wish to turn off checking for a section of code, you can put a comment in the source
0020 before and after the section, with the following syntax:
0021
0022 // scalastyle:off
0023 ... // stuff that breaks the styles
0024 // scalastyle:on
0025
0026 You can also disable only one rule, by specifying its rule id, as specified in:
0027 http://www.scalastyle.org/rules-0.7.0.html
0028
0029 // scalastyle:off no.finalize
0030 override def finalize(): Unit = ...
0031 // scalastyle:on no.finalize
0032
0033 This file is divided into 3 sections:
0034 (1) rules that we enforce.
0035 (2) rules that we would like to enforce, but haven't cleaned up the codebase to turn on yet
0036 (or we need to make the scalastyle rule more configurable).
0037 (3) rules that we don't want to enforce.
0038 -->
0039
0040 <scalastyle>
0041 <name>Scalastyle standard configuration</name>
0042
0043 <!-- ================================================================================ -->
0044 <!-- rules we enforce -->
0045 <!-- ================================================================================ -->
0046
0047 <check level="error" class="org.scalastyle.file.FileTabChecker" enabled="true"></check>
0048
0049 <check level="error" class="org.scalastyle.file.HeaderMatchesChecker" enabled="true">
0050 <parameters>
0051 <parameter name="header"><![CDATA[/*
0052 * Licensed to the Apache Software Foundation (ASF) under one or more
0053 * contributor license agreements. See the NOTICE file distributed with
0054 * this work for additional information regarding copyright ownership.
0055 * The ASF licenses this file to You under the Apache License, Version 2.0
0056 * (the "License"); you may not use this file except in compliance with
0057 * the License. You may obtain a copy of the License at
0058 *
0059 * http://www.apache.org/licenses/LICENSE-2.0
0060 *
0061 * Unless required by applicable law or agreed to in writing, software
0062 * distributed under the License is distributed on an "AS IS" BASIS,
0063 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0064 * See the License for the specific language governing permissions and
0065 * limitations under the License.
0066 */]]></parameter>
0067 </parameters>
0068 </check>
0069
0070 <check level="error" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check>
0071
0072 <check level="error" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check>
0073
0074 <check level="error" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check>
0075
0076 <check level="error" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
0077 <parameters>
0078 <parameter name="maxLineLength"><![CDATA[100]]></parameter>
0079 <parameter name="tabSize"><![CDATA[2]]></parameter>
0080 <parameter name="ignoreImports">true</parameter>
0081 </parameters>
0082 </check>
0083
0084 <check level="error" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true">
0085 <parameters><parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter></parameters>
0086 </check>
0087
0088 <check level="error" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true">
0089 <parameters><parameter name="regex"><![CDATA[(config|[A-Z][A-Za-z]*)]]></parameter></parameters>
0090 </check>
0091
0092 <check level="error" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true">
0093 <parameters><parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter></parameters>
0094 </check>
0095
0096 <check customId="argcount" level="error" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true">
0097 <parameters><parameter name="maxParameters"><![CDATA[10]]></parameter></parameters>
0098 </check>
0099
0100 <check level="error" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check>
0101
0102 <check level="error" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check>
0103
0104 <check level="error" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check>
0105
0106 <check level="error" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check>
0107
0108 <check level="error" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true">
0109 <parameters>
0110 <parameter name="singleLineAllowed"><![CDATA[true]]></parameter>
0111 <parameter name="doubleLineAllowed"><![CDATA[true]]></parameter>
0112 </parameters>
0113 </check>
0114
0115 <check level="error" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"></check>
0116
0117 <check level="error" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check>
0118
0119 <check customId="nonascii" level="error" class="org.scalastyle.scalariform.NonASCIICharacterChecker" enabled="true"></check>
0120
0121 <check level="error" class="org.scalastyle.scalariform.SpaceAfterCommentStartChecker" enabled="true"></check>
0122
0123 <check level="error" class="org.scalastyle.scalariform.EnsureSingleSpaceBeforeTokenChecker" enabled="true">
0124 <parameters>
0125 <parameter name="tokens">ARROW, EQUALS, ELSE, TRY, CATCH, FINALLY, LARROW, RARROW</parameter>
0126 </parameters>
0127 </check>
0128
0129 <check level="error" class="org.scalastyle.scalariform.EnsureSingleSpaceAfterTokenChecker" enabled="true">
0130 <parameters>
0131 <parameter name="tokens">ARROW, EQUALS, COMMA, COLON, IF, ELSE, DO, WHILE, FOR, MATCH, TRY, CATCH, FINALLY, LARROW, RARROW</parameter>
0132 </parameters>
0133 </check>
0134
0135 <!-- ??? usually shouldn't be checked into the code base. -->
0136 <check level="error" class="org.scalastyle.scalariform.NotImplementedErrorUsage" enabled="true"></check>
0137
0138 <!-- As of SPARK-7558, all tests in Spark should extend o.a.s.SparkFunSuite instead of FunSuite directly -->
0139 <check customId="funsuite" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true">
0140 <parameters><parameter name="regex">^FunSuite[A-Za-z]*$</parameter></parameters>
0141 <customMessage>Tests must extend org.apache.spark.SparkFunSuite instead.</customMessage>
0142 </check>
0143
0144 <!-- As of SPARK-7977 all printlns need to be wrapped in '// scalastyle:off/on println' -->
0145 <check customId="println" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true">
0146 <parameters><parameter name="regex">^println$</parameter></parameters>
0147 <customMessage><![CDATA[Are you sure you want to println? If yes, wrap the code block with
0148 // scalastyle:off println
0149 println(...)
0150 // scalastyle:on println]]></customMessage>
0151 </check>
0152
0153 <check customId="hadoopconfiguration" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0154 <parameters><parameter name="regex">spark(.sqlContext)?.sparkContext.hadoopConfiguration</parameter></parameters>
0155 <customMessage><![CDATA[
0156 Are you sure that you want to use sparkContext.hadoopConfiguration? In most cases, you should use
0157 spark.sessionState.newHadoopConf() instead, so that the hadoop configurations specified in Spark session
0158 configuration will come into effect.
0159 If you must use sparkContext.hadoopConfiguration, wrap the code block with
0160 // scalastyle:off hadoopconfiguration
0161 spark.sparkContext.hadoopConfiguration...
0162 // scalastyle:on hadoopconfiguration
0163 ]]></customMessage>
0164 </check>
0165
0166 <check customId="visiblefortesting" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0167 <parameters><parameter name="regex">@VisibleForTesting</parameter></parameters>
0168 <customMessage><![CDATA[
0169 @VisibleForTesting causes classpath issues. Please note this in the java doc instead (SPARK-11615).
0170 ]]></customMessage>
0171 </check>
0172
0173 <check customId="runtimeaddshutdownhook" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0174 <parameters><parameter name="regex">Runtime\.getRuntime\.addShutdownHook</parameter></parameters>
0175 <customMessage><![CDATA[
0176 Are you sure that you want to use Runtime.getRuntime.addShutdownHook? In most cases, you should use
0177 ShutdownHookManager.addShutdownHook instead.
0178 If you must use Runtime.getRuntime.addShutdownHook, wrap the code block with
0179 // scalastyle:off runtimeaddshutdownhook
0180 Runtime.getRuntime.addShutdownHook(...)
0181 // scalastyle:on runtimeaddshutdownhook
0182 ]]></customMessage>
0183 </check>
0184
0185 <check customId="mutablesynchronizedbuffer" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0186 <parameters><parameter name="regex">mutable\.SynchronizedBuffer</parameter></parameters>
0187 <customMessage><![CDATA[
0188 Are you sure that you want to use mutable.SynchronizedBuffer? In most cases, you should use
0189 java.util.concurrent.ConcurrentLinkedQueue instead.
0190 If you must use mutable.SynchronizedBuffer, wrap the code block with
0191 // scalastyle:off mutablesynchronizedbuffer
0192 mutable.SynchronizedBuffer[...]
0193 // scalastyle:on mutablesynchronizedbuffer
0194 ]]></customMessage>
0195 </check>
0196
0197 <check customId="classforname" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0198 <parameters><parameter name="regex">Class\.forName</parameter></parameters>
0199 <customMessage><![CDATA[
0200 Are you sure that you want to use Class.forName? In most cases, you should use Utils.classForName instead.
0201 If you must use Class.forName, wrap the code block with
0202 // scalastyle:off classforname
0203 Class.forName(...)
0204 // scalastyle:on classforname
0205 ]]></customMessage>
0206 </check>
0207
0208 <check customId="awaitresult" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0209 <parameters><parameter name="regex">Await\.result</parameter></parameters>
0210 <customMessage><![CDATA[
0211 Are you sure that you want to use Await.result? In most cases, you should use ThreadUtils.awaitResult instead.
0212 If you must use Await.result, wrap the code block with
0213 // scalastyle:off awaitresult
0214 Await.result(...)
0215 // scalastyle:on awaitresult
0216 ]]></customMessage>
0217 </check>
0218
0219 <check customId="awaitready" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0220 <parameters><parameter name="regex">Await\.ready</parameter></parameters>
0221 <customMessage><![CDATA[
0222 Are you sure that you want to use Await.ready? In most cases, you should use ThreadUtils.awaitReady instead.
0223 If you must use Await.ready, wrap the code block with
0224 // scalastyle:off awaitready
0225 Await.ready(...)
0226 // scalastyle:on awaitready
0227 ]]></customMessage>
0228 </check>
0229
0230 <check customId="caselocale" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0231 <parameters><parameter name="regex">(\.toUpperCase|\.toLowerCase)(?!(\(|\(Locale.ROOT\)))</parameter></parameters>
0232 <customMessage><![CDATA[
0233 Are you sure that you want to use toUpperCase or toLowerCase without the root locale? In most cases, you
0234 should use toUpperCase(Locale.ROOT) or toLowerCase(Locale.ROOT) instead.
0235 If you must use toUpperCase or toLowerCase without the root locale, wrap the code block with
0236 // scalastyle:off caselocale
0237 .toUpperCase
0238 .toLowerCase
0239 // scalastyle:on caselocale
0240 ]]></customMessage>
0241 </check>
0242
0243 <check customId="throwerror" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0244 <parameters><parameter name="regex">throw new \w+Error\(</parameter></parameters>
0245 <customMessage><![CDATA[
0246 Are you sure that you want to throw Error? In most cases, you should use appropriate Exception instead.
0247 If you must throw Error, wrap the code block with
0248 // scalastyle:off throwerror
0249 throw new XXXError(...)
0250 // scalastyle:on throwerror
0251 ]]></customMessage>
0252 </check>
0253
0254 <!-- As of SPARK-9613 JavaConversions should be replaced with JavaConverters -->
0255 <check customId="javaconversions" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true">
0256 <parameters><parameter name="regex">JavaConversions</parameter></parameters>
0257 <customMessage>Instead of importing implicits in scala.collection.JavaConversions._, import
0258 scala.collection.JavaConverters._ and use .asScala / .asJava methods</customMessage>
0259 </check>
0260
0261 <check customId="commonslang2" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0262 <parameters><parameter name="regex">org\.apache\.commons\.lang\.</parameter></parameters>
0263 <customMessage>Use Commons Lang 3 classes (package org.apache.commons.lang3.*) instead
0264 of Commons Lang 2 (package org.apache.commons.lang.*)</customMessage>
0265 </check>
0266
0267 <check customId="extractopt" level="error" class="org.scalastyle.scalariform.TokenChecker" enabled="true">
0268 <parameters><parameter name="regex">extractOpt</parameter></parameters>
0269 <customMessage>Use jsonOption(x).map(.extract[T]) instead of .extractOpt[T], as the latter
0270 is slower. </customMessage>
0271 </check>
0272
0273 <check level="error" class="org.scalastyle.scalariform.ImportOrderChecker" enabled="true">
0274 <parameters>
0275 <parameter name="groups">java,scala,3rdParty,spark</parameter>
0276 <parameter name="group.java">javax?\..*</parameter>
0277 <parameter name="group.scala">scala\..*</parameter>
0278 <parameter name="group.3rdParty">(?!org\.apache\.spark\.).*</parameter>
0279 <parameter name="group.spark">org\.apache\.spark\..*</parameter>
0280 </parameters>
0281 </check>
0282
0283 <check level="error" class="org.scalastyle.scalariform.DisallowSpaceBeforeTokenChecker" enabled="true">
0284 <parameters>
0285 <parameter name="tokens">COMMA</parameter>
0286 </parameters>
0287 </check>
0288
0289 <!-- SPARK-3854: Single Space between ')' and '{' -->
0290 <check customId="SingleSpaceBetweenRParenAndLCurlyBrace" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0291 <parameters><parameter name="regex">\)\{</parameter></parameters>
0292 <customMessage><![CDATA[
0293 Single Space between ')' and `{`.
0294 ]]></customMessage>
0295 </check>
0296
0297 <check customId="NoScalaDoc" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0298 <parameters><parameter name="regex">(?m)^(\s*)/[*][*].*$(\r|)\n^\1 [*]</parameter></parameters>
0299 <customMessage>Use Javadoc style indentation for multiline comments</customMessage>
0300 </check>
0301
0302 <check customId="OmitBracesInCase" level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
0303 <parameters><parameter name="regex">case[^\n>]*=>\s*\{</parameter></parameters>
0304 <customMessage>Omit braces in case clauses.</customMessage>
0305 </check>
0306
0307 <!-- SPARK-16877: Avoid Java annotations -->
0308 <check level="error" class="org.scalastyle.scalariform.OverrideJavaChecker" enabled="true"></check>
0309
0310 <check level="error" class="org.scalastyle.scalariform.DeprecatedJavaChecker" enabled="true"></check>
0311
0312 <!-- ================================================================================ -->
0313 <!-- rules we'd like to enforce, but haven't cleaned up the codebase yet -->
0314 <!-- ================================================================================ -->
0315
0316 <!-- We cannot turn the following two on, because it'd fail a lot of string interpolation use cases. -->
0317 <!-- Ideally the following two rules should be configurable to rule out string interpolation. -->
0318 <check level="error" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="false"></check>
0319 <check level="error" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="false"></check>
0320
0321 <!-- This breaks symbolic method names so we don't turn it on. -->
0322 <!-- Maybe we should update it to allow basic symbolic names, and then we are good to go. -->
0323 <check level="error" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="false">
0324 <parameters>
0325 <parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter>
0326 </parameters>
0327 </check>
0328
0329 <!-- Should turn this on, but we have a few places that need to be fixed first -->
0330 <check level="error" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check>
0331
0332 <!-- ================================================================================ -->
0333 <!-- rules we don't want -->
0334 <!-- ================================================================================ -->
0335
0336 <check level="error" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="false">
0337 <parameters><parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter></parameters>
0338 </check>
0339
0340 <!-- We want the opposite of this: NewLineAtEofChecker -->
0341 <check level="error" class="org.scalastyle.file.NoNewLineAtEofChecker" enabled="false"></check>
0342
0343 <!-- This one complains about all kinds of random things. Disable. -->
0344 <check level="error" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="false"></check>
0345
0346 <!-- We use return quite a bit for control flows and guards -->
0347 <check level="error" class="org.scalastyle.scalariform.ReturnChecker" enabled="false"></check>
0348
0349 <!-- We use null a lot in low level code and to interface with 3rd party code -->
0350 <check level="error" class="org.scalastyle.scalariform.NullChecker" enabled="false"></check>
0351
0352 <!-- Doesn't seem super big deal here ... -->
0353 <check level="error" class="org.scalastyle.scalariform.NoCloneChecker" enabled="false"></check>
0354
0355 <!-- Doesn't seem super big deal here ... -->
0356 <check level="error" class="org.scalastyle.file.FileLengthChecker" enabled="false">
0357 <parameters><parameter name="maxFileLength">800></parameter></parameters>
0358 </check>
0359
0360 <!-- Doesn't seem super big deal here ... -->
0361 <check level="error" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="false">
0362 <parameters><parameter name="maxTypes">30</parameter></parameters>
0363 </check>
0364
0365 <!-- Doesn't seem super big deal here ... -->
0366 <check level="error" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="false">
0367 <parameters><parameter name="maximum">10</parameter></parameters>
0368 </check>
0369
0370 <!-- Doesn't seem super big deal here ... -->
0371 <check level="error" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="false">
0372 <parameters><parameter name="maxLength">50</parameter></parameters>
0373 </check>
0374
0375 <!-- Not exactly feasible to enforce this right now. -->
0376 <!-- It is also infrequent that somebody introduces a new class with a lot of methods. -->
0377 <check level="error" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="false">
0378 <parameters><parameter name="maxMethods"><![CDATA[30]]></parameter></parameters>
0379 </check>
0380
0381 <!-- Doesn't seem super big deal here, and we have a lot of magic numbers ... -->
0382 <check level="error" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="false">
0383 <parameters><parameter name="ignore">-1,0,1,2,3</parameter></parameters>
0384 </check>
0385
0386 </scalastyle>