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