start of checkstyle inclusion... (#48)

* start of checkstyle inclusion

* checkstyle!
This commit is contained in:
Brian Plummer 2017-01-11 10:04:44 -05:00 committed by Mike Nakhimovich
parent 23f4b05ba3
commit eaa4219dd7
21 changed files with 383 additions and 88 deletions

1
cache/build.gradle vendored
View file

@ -41,3 +41,4 @@ artifacts {
}
apply from: rootProject.file("gradle/maven-push.gradle")
//apply from: rootProject.file("gradle/checkstyle.gradle")

232
checkstyle-ruleset.xml Normal file
View file

@ -0,0 +1,232 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<!-- This is a checkstyle configuration file. For descriptions of
what the following rules do, please see the checkstyle configuration
page at http://checkstyle.sourceforge.net/config.html -->
<module name="Checker">
<module name="FileTabCharacter"/>
<module name="NewlineAtEndOfFile"/>
<module name="SuppressionCommentFilter"/>
<module name="RegexpSingleline">
<!-- Checks that FIXME is not used in comments. TODO is preferred.
-->
<property name="format" value="((//.*)|(\*.*))FIXME"/>
<property name="message"
value='TODO is preferred to FIXME. e.g. "TODO(johndoe): Refactor when v2 is released."'/>
</module>
<!-- All Java AST specific tests live under TreeWalker module. -->
<module name="TreeWalker">
<module name="FileContentsHolder"/>
<module name="TodoComment"/>
<module name="RedundantImport"/>
<module name="ImportOrder">
<!-- Checks for out of order import statements. -->
<property name="severity" value="warning"/>
<property name="groups" value="android,com,junit,net,org,java,javax"/>
<!-- This ensures that static imports go on bottom. -->
<property name="option" value="bottom"/>
<property name="sortStaticImportsAlphabetically" value="true"/>
<property name="tokens" value="STATIC_IMPORT, IMPORT"/>
</module>
<module name="PackageName">
<!-- Validates identifiers for package names against the
supplied expression. -->
<!-- Here the default checkstyle rule restricts package name parts to
seven characters
-->
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]{1,})*$"/>
<property name="severity" value="warning"/>
</module>
<module name="TypeNameCheck">
<!-- Validates static, final fields against the
expression "^[A-Z][a-zA-Z0-9]*$". -->
<metadata name="altname" value="TypeName"/>
<property name="severity" value="warning"/>
</module>
<module name="ConstantNameCheck">
<!-- Validates non-private, static, final fields against the supplied
public/package final fields "^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$". -->
<metadata name="altname" value="ConstantName"/>
<property name="applyToPublic" value="true"/>
<property name="applyToProtected" value="true"/>
<property name="applyToPackage" value="true"/>
<property name="applyToPrivate" value="false"/>
<property name="format" value="^([A-Z][A-Z0-9]*(_[A-Z0-9]+)*|FLAG_.*)$"/>
<message key="name.invalidPattern"
value="Variable ''{0}'' should be in ALL_CAPS (if it is a constant) or be private (otherwise)."/>
<property name="severity" value="warning"/>
</module>
<module name="StaticVariableNameCheck">
<!-- Validates static, non-final fields against the supplied
expression "^[a-z][a-zA-Z0-9]*_?$". -->
<metadata name="altname" value="StaticVariableName"/>
<property name="applyToPublic" value="true"/>
<property name="applyToProtected" value="true"/>
<property name="applyToPackage" value="true"/>
<property name="applyToPrivate" value="true"/>
<property name="format" value="^[a-z][a-zA-Z0-9]*_?$"/>
<property name="severity" value="warning"/>
</module>
<module name="MemberNameCheck">
<!-- Validates non-static members against the supplied expression. -->
<metadata name="altname" value="MemberName"/>
<property name="applyToPublic" value="true"/>
<property name="applyToProtected" value="true"/>
<property name="applyToPackage" value="true"/>
<property name="applyToPrivate" value="true"/>
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
<property name="severity" value="warning"/>
</module>
<module name="MethodNameCheck">
<!-- Validates identifiers for method names. -->
<metadata name="altname" value="MethodName"/>
<property name="format" value="^[a-z][a-zA-Z0-9]*(_[a-zA-Z0-9]+)*$"/>
<property name="severity" value="warning"/>
</module>
<module name="ParameterName">
<!-- Validates identifiers for method parameters against the
expression "^[a-z][a-zA-Z0-9]*$". -->
<property name="severity" value="warning"/>
</module>
<module name="LocalFinalVariableName">
<!-- Validates identifiers for local final variables against the
expression "^[a-z][a-zA-Z0-9]*$". -->
<property name="severity" value="warning"/>
</module>
<module name="LocalVariableName">
<!-- Validates identifiers for local variables against the
expression "^[a-z][a-zA-Z0-9]*$". -->
<property name="severity" value="warning"/>
</module>
<module name="LineLength">
<property name="max" default="100" value="120"/>
<property name="severity" value="error"/>
<!--
The default ignore pattern exempts the following elements:
- import statements
- long URLs inside comments
-->
<property name="ignorePattern"
default="^(package .*;\s*)|(import .*;\s*)|( *\* *https?://.*)$"
value="^(package .*;\s*)|(import .*;\s*)|( *\* *https?://.*)$"/>
</module>
<module name="LeftCurly">
<!-- Checks for placement of the left curly brace ('{'). -->
<property name="severity" value="warning"/>
</module>
<module name="RightCurly">
<!-- Checks right curlies on CATCH, ELSE, and TRY blocks are on
the same line. e.g., the following example is fine:
<pre>
if {
...
} else
</pre>
-->
<!-- This next example is not fine:
<pre>
if {
...
}
else
</pre>
-->
<property name="option" value="same"/>
<property name="severity" value="warning"/>
</module>
<!-- Checks for braces around if and else blocks -->
<module name="NeedBraces">
<property name="severity" value="warning"/>
<property name="tokens" value="LITERAL_IF, LITERAL_ELSE, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO"/>
</module>
<module name="UpperEll">
<!-- Checks that long constants are defined with an upper ell.-->
<property name="severity" value="error"/>
</module>
<module name="FallThrough">
<!-- Warn about falling through to the next case statement. Similar to
javac -Xlint:fallthrough, but the check is suppressed if a single-line comment
on the last non-blank line preceding the fallen-into case contains 'fall through' (or
some other variants which we don't publicized to promote consistency).
-->
<property name="reliefPattern"
value="fall through|Fall through|fallthru|Fallthru|falls through|Falls through|fallthrough|Fallthrough|No break|NO break|no break|continue on"/>
<property name="severity" value="error"/>
</module>
<module name="ModifierOrder"/>
<module name="WhitespaceAround">
<!-- Checks that various tokens are surrounded by whitespace.
This includes most binary operators and keywords followed
by regular or curly braces.
-->
<property name="tokens" value="ASSIGN, BAND, BAND_ASSIGN, BOR,
BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN,
EQUAL, GE, GT, LAND, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS,
MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION,
SL, SL_ASSIGN, SR_ASSIGN, STAR, STAR_ASSIGN"/>
<property name="severity" value="error"/>
</module>
<module name="WhitespaceAfter">
<!-- Checks that commas, semicolons and typecasts are followed by
whitespace.
-->
<property name="tokens" value="COMMA, SEMI, TYPECAST"/>
</module>
<module name="NoWhitespaceAfter">
<!-- Checks that there is no whitespace after various unary operators.
Linebreaks are allowed.
-->
<property name="tokens" value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS,
UNARY_PLUS"/>
<property name="allowLineBreaks" value="true"/>
<property name="severity" value="error"/>
</module>
<module name="NoWhitespaceBefore">
<!-- Checks that there is no whitespace before various unary operators.
Linebreaks are allowed.
-->
<property name="tokens" value="SEMI, DOT, POST_DEC, POST_INC"/>
<property name="allowLineBreaks" value="true"/>
<property name="severity" value="error"/>
</module>
<module name="ParenPad">
<!-- Checks that there is no whitespace before close parens or after
open parens.
-->
<property name="severity" value="warning"/>
</module>
<module name="DeclarationOrder"/>
</module>
</module>

View file

@ -44,5 +44,5 @@ dependencies {
testCompile libraries.robolectric
}
apply from: rootProject.file("gradle/maven-push.gradle")
apply from: rootProject.file("gradle/checkstyle.gradle")

View file

@ -17,10 +17,13 @@ public class SourcePersisterFactory {
/**
* Returns a new {@link BufferedSource} persister with the provided file as the root of the
* persistence {@link com.nytimes.android.external.fs.filesystem.FileSystem}.
*
* @throws IOException
*/
public static Persister<BufferedSource> create(File root) throws IOException {
if (root == null) throw new IllegalArgumentException("root file cannot be null.");
if (root == null) {
throw new IllegalArgumentException("root file cannot be null.");
}
return new SourcePersister(FileSystemFactory.create(root));
}
}

View file

@ -19,7 +19,7 @@ public class Util {
Stack<String> stack = new Stack<String>();
for (String str : arr) {
if(str.equals("/")){
if (str.equals("/")) {
continue;
}
if (str.equals("..")) {

View file

@ -20,18 +20,19 @@ package com.nytimes.android.external.fs.filesystem;
//package org.jpublish.util;
import java.io.File;
import java.util.Stack;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Stack;
/** Breadth first iterator which iterates through all files which are decendents
of the specified root file.
@author Anthony Eden
@since 1.1
/**
* Breadth first iterator which iterates through all files which are decendents
* of the specified root file.
*
* @author Anthony Eden
* @since 1.1
*/
class BreadthFirstFileTreeIterator implements Iterator{
class BreadthFirstFileTreeIterator implements Iterator {
private File root;
private int currentIndex = 0;
@ -40,83 +41,88 @@ class BreadthFirstFileTreeIterator implements Iterator{
private Stack directories;
private boolean endOfTree = false;
/** Construct a new BreadthFirstFileTreeIterator with the specified root.
@param root The root directory
/**
* Construct a new BreadthFirstFileTreeIterator with the specified root.
*
* @param root The root directory
*/
BreadthFirstFileTreeIterator(File root){
BreadthFirstFileTreeIterator(File root) {
this.root = root;
this.currentList = root.listFiles();
this.directories = new Stack();
}
/** Returns true if the iteration has more elements. (In other words,
returns true if next would return an element rather than throwing
an exception.)
@return True if the iteration has more elements
/**
* Returns true if the iteration has more elements. (In other words,
* returns true if next would return an element rather than throwing
* an exception.)
*
* @return True if the iteration has more elements
*/
public boolean hasNext(){
if(endOfTree)
return false;
return getNextFile() != null;
public boolean hasNext() {
return !endOfTree && getNextFile() != null;
}
/** Returns the next element in the iteration.
@return The next element in the iteration
/**
* Returns the next element in the iteration.
*
* @return The next element in the iteration
*/
public Object next(){
if(endOfTree)
public Object next() {
if (endOfTree) {
throw new NoSuchElementException();
}
File file = getNextFile();
if(file == null){
if (file == null) {
throw new NoSuchElementException();
}
this.nextFile = null;
return file;
}
/** Removes from the underlying collection the last element returned by
the iterator (optional operation). This method can be called only
once per call to next. The behavior of an iterator is unspecified
if the underlying collection is modified while the iteration is in
progress in any way other than by calling this method.
@throws UnsupportedOperationException
/**
* Removes from the underlying collection the last element returned by
* the iterator (optional operation). This method can be called only
* once per call to next. The behavior of an iterator is unspecified
* if the underlying collection is modified while the iteration is in
* progress in any way other than by calling this method.
*
* @throws UnsupportedOperationException
*/
public void remove(){
public void remove() {
throw new UnsupportedOperationException();
}
/** Get the next file. If the value for the next file is null then the
findNextFile() method is invoked to locate the next file. A call
to next() will return the next file and will null out the next file
variable.
@return The next file
/**
* Get the next file. If the value for the next file is null then the
* findNextFile() method is invoked to locate the next file. A call
* to next() will return the next file and will null out the next file
* variable.
*
* @return The next file
*/
protected File getNextFile(){
if(nextFile == null){
protected File getNextFile() {
if (nextFile == null) {
nextFile = findNextFile();
}
return nextFile;
}
/** Find the next file.
@return The next file
/**
* Find the next file.
*
* @return The next file
*/
protected File findNextFile(){
while(currentIndex < currentList.length){
if(currentList[currentIndex].isDirectory()){
protected File findNextFile() {
while (currentIndex < currentList.length) {
if (currentList[currentIndex].isDirectory()) {
directories.push(currentList[currentIndex]);
currentIndex++;
} else {
@ -126,12 +132,12 @@ class BreadthFirstFileTreeIterator implements Iterator{
}
}
while(!directories.empty()){
File directory = (File)directories.remove(0);
while (!directories.empty()) {
File directory = (File) directories.remove(0);
currentList = directory.listFiles();
currentIndex = 0;
File file = findNextFile();
if(file != null){
if (file != null) {
return file;
}
}

View file

@ -57,8 +57,7 @@ class FSFile {
if (!tmpFile.renameTo(file)) {
throw new IOException("unable to move tmp file to " + file.getPath());
}
}
catch (Exception e){
} catch (Exception e) {
throw new IOException("unable to write to file");
} finally {

View file

@ -4,14 +4,17 @@ import com.google.common.collect.ImmutableMap;
import com.nytimes.android.external.fs.filesystem.FileSystem;
import com.nytimes.android.external.fs.filesystem.FileSystemFactory;
import com.nytimes.android.external.fs.impl.BaseTestCase;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import okio.BufferedSource;
import okio.Okio;
import org.junit.Test;
import static com.google.common.base.Charsets.UTF_8;
import static com.google.common.io.Files.createTempDir;

View file

@ -1,11 +1,11 @@
package com.nytimes.android.external.fs;
import com.google.gson.Gson;
import com.nytimes.android.external.store.middleware.GsonSourceParser;
import com.nytimes.android.external.store.base.Fetcher;
import com.nytimes.android.external.store.base.Store;
import com.nytimes.android.external.store.base.impl.BarCode;
import com.nytimes.android.external.store.base.impl.ParsingStoreBuilder;
import com.nytimes.android.external.store.middleware.GsonSourceParser;
import org.junit.Test;
import org.mockito.Mock;

View file

@ -3,14 +3,17 @@ package com.nytimes.android.external.fs.impl;
import com.nytimes.android.external.fs.filesystem.FileSystem;
import com.nytimes.android.external.fs.filesystem.FileSystemFactory;
import org.junit.Before;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import okio.BufferedSource;
import okio.Okio;
import org.junit.Before;
import org.junit.Test;
import static com.google.common.base.Charsets.UTF_8;
import static com.google.common.io.Files.createTempDir;
@ -72,7 +75,7 @@ public class SimpleTest extends BaseTestCase {
fileSystem.delete("/boo"); // now delete the file
assertThat(fileSystem.exists("/boo")).isFalse(); // exists() should say it's gone even though
// we still have a source to it
// we still have a source to it
fileSystem.write("/boo", source(testString2)); // and now un-delete it by writing a new version
assertThat(fileSystem.exists("/boo")).isTrue(); // exists() should say it's back
BufferedSource source2 = fileSystem.read("/boo"); // open another source and hang onto it

31
gradle/checkstyle.gradle Normal file
View file

@ -0,0 +1,31 @@
apply plugin: 'checkstyle'
preBuild.dependsOn('checkstyle')
assemble.dependsOn('lint')
check.dependsOn('checkstyle')
configurations {
checksytleOverride
}
dependencies {
checksytleOverride('com.puppycrawl.tools:checkstyle:7.1.1')
}
tasks.withType(Checkstyle) {
checkstyleClasspath = project.configurations.checksytleOverride
}
task checkstyle(type: Checkstyle) {
configFile file("${project.rootDir}/checkstyle-ruleset.xml")
source 'src'
include '**/*.java'
exclude '**/gen/**'
reports {
xml.enabled = true
}
classpath = files()
}

View file

@ -53,4 +53,4 @@ artifacts {
archives sourcesJar
}
apply from: rootProject.file("gradle/maven-push.gradle")
apply from: rootProject.file("gradle/checkstyle.gradle")

View file

@ -18,8 +18,12 @@ public class GsonParserFactory {
* the provided {@link Gson} instance.
*/
public static <T> Parser<Reader, T> createReaderParser(Gson gson, Type type) {
if (gson == null) throw new IllegalArgumentException("gson cannot be null.");
if (type == null) throw new IllegalArgumentException("type cannot be null.");
if (gson == null) {
throw new IllegalArgumentException("gson cannot be null.");
}
if (type == null) {
throw new IllegalArgumentException("type cannot be null.");
}
return new GsonReaderParser<>(gson, type);
}
@ -28,7 +32,9 @@ public class GsonParserFactory {
* a new default configured {@link Gson} instance.
*/
public static <T> Parser<Reader, T> createReaderParser(Type type) {
if (type == null) throw new IllegalArgumentException("type cannot be null.");
if (type == null) {
throw new IllegalArgumentException("type cannot be null.");
}
return new GsonReaderParser<>(new Gson(), type);
}
@ -37,8 +43,12 @@ public class GsonParserFactory {
* the provided {@link Gson} instance.
*/
public static <T> Parser<BufferedSource, T> createSourceParser(Gson gson, Type type) {
if (gson == null) throw new IllegalArgumentException("gson cannot be null.");
if (type == null) throw new IllegalArgumentException("type cannot be null.");
if (gson == null) {
throw new IllegalArgumentException("gson cannot be null.");
}
if (type == null) {
throw new IllegalArgumentException("type cannot be null.");
}
return new GsonSourceParser<>(gson, type);
}
@ -47,7 +57,9 @@ public class GsonParserFactory {
* a new default configured {@link Gson} instance.
*/
public static <T> Parser<BufferedSource, T> createSourceParser(Type type) {
if (type == null) throw new IllegalArgumentException("type cannot be null.");
if (type == null) {
throw new IllegalArgumentException("type cannot be null.");
}
return new GsonSourceParser<>(new Gson(), type);
}
@ -55,9 +67,13 @@ public class GsonParserFactory {
* Returns a new Parser which parses from a String to the specified type, using
* the provided {@link Gson} instance.
*/
public static <T> Parser<String, T> createStringParser(Gson gson,Type type) {
if (gson == null) throw new IllegalArgumentException("gson cannot be null.");
if (type == null) throw new IllegalArgumentException("type cannot be null.");
public static <T> Parser<String, T> createStringParser(Gson gson, Type type) {
if (gson == null) {
throw new IllegalArgumentException("gson cannot be null.");
}
if (type == null) {
throw new IllegalArgumentException("type cannot be null.");
}
return new GsonStringParser<>(gson, type);
}
@ -66,7 +82,9 @@ public class GsonParserFactory {
* a new default {@link Gson} instance.
*/
public static <T> Parser<String, T> createStringParser(Class<T> type) {
if (type == null) throw new IllegalArgumentException("type cannot be null.");
if (type == null) {
throw new IllegalArgumentException("type cannot be null.");
}
return new GsonStringParser<>(new Gson(), type);
}

View file

@ -14,7 +14,7 @@ public class GsonReaderParser<Parsed> implements Parser<Reader, Parsed> {
private final Type type;
@Inject
public GsonReaderParser(Gson gson,Type type) {
public GsonReaderParser(Gson gson, Type type) {
this.gson = gson;
this.type = type;
}

View file

@ -17,8 +17,8 @@ import okio.BufferedSource;
* example usage:
* ParsingStoreBuilder.<BufferedSource, BookResults>builder()
* .fetcher(fetcher)
* .persister(new SourcePersister(fileSystem))
* .parser(new GsonSourceParser<>(gson, BookResults.class))
* .persister(SourcePersisterFactory.create(getApplicationContext().getCacheDir()))
* .parser(GsonParserFactory.createSourceParser(new Gson(),BookResult.class)
* .open();
*/

View file

@ -1,14 +1,13 @@
package com.nytimes.android.external.store;
import com.google.gson.Gson;
import com.nytimes.android.external.store.base.Parser;
import com.nytimes.android.external.store.middleware.GsonParserFactory;
import com.nytimes.android.external.store.middleware.GsonSourceParser;
import com.nytimes.android.external.store.base.Fetcher;
import com.nytimes.android.external.store.base.Parser;
import com.nytimes.android.external.store.base.Persister;
import com.nytimes.android.external.store.base.Store;
import com.nytimes.android.external.store.base.impl.BarCode;
import com.nytimes.android.external.store.base.impl.ParsingStoreBuilder;
import com.nytimes.android.external.store.middleware.GsonParserFactory;
import org.junit.Test;
import org.mockito.Mock;

View file

@ -42,7 +42,8 @@ public class GsonSourceListParserTest {
MockitoAnnotations.initMocks(this);
Parser<BufferedSource, List<Foo>> parser =
GsonParserFactory.createSourceParser(new Gson(),new TypeToken<List<Foo>>() {}.getType());
GsonParserFactory.createSourceParser(new Gson(), new TypeToken<List<Foo>>() {
}.getType());
Store<List<Foo>> simpleStore = ParsingStoreBuilder.<BufferedSource, List<Foo>>builder()
.persister(persister)

View file

@ -56,3 +56,4 @@ artifacts {
archives sourcesJar
}
apply from: rootProject.file("gradle/maven-push.gradle")
apply from: rootProject.file("gradle/checkstyle.gradle")

View file

@ -30,6 +30,6 @@ public final class BarCode implements Serializable {
}
public static BarCode empty() {
return new BarCode("","");
return new BarCode("", "");
}
}

View file

@ -23,7 +23,7 @@ public class RealStore<Parsed> implements Store<Parsed> {
}
public RealStore(Fetcher<Parsed> fetcher) {
internalStore = new RealInternalStore<>(fetcher,new NoopPersister<Parsed>(),
internalStore = new RealInternalStore<>(fetcher, new NoopPersister<Parsed>(),
new NoopParserFunc<Parsed, Parsed>());
}
@ -46,15 +46,13 @@ public class RealStore<Parsed> implements Store<Parsed> {
}
public <Raw> RealStore(Fetcher<Raw> fetcher,
Persister<Raw> persister,
Cache<BarCode, Observable<Parsed>> memCache) {
internalStore= new RealInternalStore<>(fetcher, persister, new NoopParserFunc<Raw, Parsed>(), memCache);
Persister<Raw> persister,
Cache<BarCode, Observable<Parsed>> memCache) {
internalStore = new RealInternalStore<>(fetcher, persister, new NoopParserFunc<Raw, Parsed>(), memCache);
}
@Override
public Observable<Parsed> get(@NonNull final BarCode barCode) {
return internalStore.get(barCode);

View file

@ -24,10 +24,10 @@ public class NoopPersisterTest {
public void noopParserFuncTest() throws Exception {
NoopParserFunc<String, String> noopParserFunc = new NoopParserFunc<>();
String input = "foo";
String output = (String) noopParserFunc.call((Object) input);
String output = (String) noopParserFunc.call(input);
assertThat(input).isEqualTo(output);
//intended object ref comparison
assertThat(input == output).isTrue();
}
}
}