Skip to content

Commit 772c422

Browse files
Rework filtering: moved to options
1 parent 6ca90f0 commit 772c422

File tree

12 files changed

+77
-56
lines changed

12 files changed

+77
-56
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## [0.0.4] - Unreleased
9-
- TODO
9+
10+
### Changed
11+
- Filtering: moved to options
1012

1113

1214
## [0.0.3] - 2025-09-21

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,9 @@ The `PathPredicates` class provides several ready-to-use `Predicate<Path>` imple
273273

274274
```java
275275
// Example: Filtering.java
276-
var filter = PathPredicates.hasExtension("java");
277-
var tree = FileTreePrettyPrinter.createDefault()
278-
.prettyPrint("src/example/resources/filtering", filter);
276+
var prettyPrinter = FileTreePrettyPrinter.builder()
277+
.customizeOptions(options -> options.filter(PathPredicates.hasExtension("java")))
278+
.build();
279279
```
280280
```
281281
filtering/

ROADMAP.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- [ ] Option: color
2929
- [ ] Refactor unit tests (custom assert?)
3030
- [ ] Jacoco coverage report
31+
- [ ] More `PathPredicates` functions!
3132

3233
## Abandoned
3334
These ideas will likely not been implemented because they do not align with JFileTreePrettyPrint vision:

src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
public class Filtering {
77

88
public static void main(String[] args) {
9-
var filter = PathPredicates.hasExtension("java");
10-
var prettyPrinter = FileTreePrettyPrinter.createDefault();
11-
var tree = prettyPrinter.prettyPrint("src/example/resources/filtering", filter);
9+
var prettyPrinter = FileTreePrettyPrinter.builder()
10+
.customizeOptions(options -> options.filter(PathPredicates.hasExtension("java")))
11+
.build();
12+
13+
var tree = prettyPrinter.prettyPrint("src/example/resources/filtering");
1214
System.out.println(tree);
1315
}
1416

src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/DefaultFileTreePrettyPrinter.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
import io.github.computerdaddyguy.jfiletreeprettyprinter.scanner.PathToTreeScanner;
55
import java.nio.file.Path;
66
import java.util.Objects;
7-
import java.util.function.Predicate;
87
import org.jspecify.annotations.NullMarked;
9-
import org.jspecify.annotations.Nullable;
108

119
@NullMarked
1210
class DefaultFileTreePrettyPrinter implements FileTreePrettyPrinter {
@@ -20,8 +18,8 @@ public DefaultFileTreePrettyPrinter(PathToTreeScanner scanner, TreeEntryRenderer
2018
}
2119

2220
@Override
23-
public String prettyPrint(Path path, @Nullable Predicate<Path> filter) {
24-
var tree = scanner.scan(path, filter);
21+
public String prettyPrint(Path path) {
22+
var tree = scanner.scan(path);
2523
return renderer.renderTree(tree);
2624
}
2725

src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinter.java

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package io.github.computerdaddyguy.jfiletreeprettyprinter;
22

33
import java.nio.file.Path;
4-
import java.util.function.Predicate;
54
import org.jspecify.annotations.NullMarked;
6-
import org.jspecify.annotations.Nullable;
75

86
/**
97
* Pretty prints a file tree, and returns the result as a String.
@@ -20,34 +18,15 @@ public interface FileTreePrettyPrinter {
2018
* @param path A directory or a file.
2119
* @param filter Filter for paths to retain, <code>null</code> will retain all files. Applies only on children paths, not root path.
2220
*/
23-
String prettyPrint(Path path, @Nullable Predicate<Path> filter);
24-
25-
/**
26-
* Pretty prints the given path.
27-
*
28-
* @param path A directory or a file.
29-
*/
30-
default String prettyPrint(Path path) {
31-
return prettyPrint(path, null);
32-
}
21+
String prettyPrint(Path path);
3322

3423
/**
3524
* Pretty prints the given path.
3625
*
3726
* @param path A directory or a file.
3827
*/
3928
default String prettyPrint(String path) {
40-
return prettyPrint(path, null);
41-
}
42-
43-
/**
44-
* Pretty prints the given path.
45-
*
46-
* @param path A directory or a file.
47-
* @param filter Filter for paths to retain, <code>null</code> will retain all files. Applies only on children paths, not root path.
48-
*/
49-
default String prettyPrint(String path, @Nullable Predicate<Path> filter) {
50-
return prettyPrint(Path.of(path), filter);
29+
return prettyPrint(Path.of(path));
5130
}
5231

5332
/**

src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PrettyPrintOptions.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
import java.nio.file.Path;
66
import java.util.Comparator;
77
import java.util.Objects;
8+
import java.util.function.Predicate;
89
import java.util.function.ToIntFunction;
910
import org.jspecify.annotations.NullMarked;
11+
import org.jspecify.annotations.Nullable;
1012

1113
@NullMarked
1214
public class PrettyPrintOptions implements ScanningOptions, RenderingOptions {
@@ -278,4 +280,28 @@ public PrettyPrintOptions sort(Comparator<Path> pathComparator) {
278280
return this;
279281
}
280282

283+
// ---------- Filtering ----------
284+
285+
@Nullable
286+
private Predicate<Path> pathFilter = null;
287+
288+
@Override
289+
@Nullable
290+
public Predicate<Path> pathFilter() {
291+
return pathFilter;
292+
}
293+
294+
/**
295+
* Use a custom filter for retain only some files and/or directories.
296+
*
297+
* Filtering is recursive by default: directory's contents will always be traversed.
298+
* However, if a directory does not match and none of its children match, the directory itself will not be displayed.
299+
300+
* @param filter The filter, <code>null</code> to disable filtering
301+
*/
302+
public PrettyPrintOptions filter(Predicate<Path> filter) {
303+
this.pathFilter = filter;
304+
return this;
305+
}
306+
281307
}

src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/DefaultPathToTreeScanner.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public DefaultPathToTreeScanner(ScanningOptions options) {
3131
}
3232

3333
@Override
34-
public TreeEntry scan(Path fileOrDir, @Nullable Predicate<Path> filter) {
35-
return handle(0, fileOrDir, filter);
34+
public TreeEntry scan(Path fileOrDir) {
35+
return handle(0, fileOrDir, options.pathFilter());
3636
}
3737

3838
@Nullable

src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/PathToTreeScanner.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package io.github.computerdaddyguy.jfiletreeprettyprinter.scanner;
22

33
import java.nio.file.Path;
4-
import java.util.function.Predicate;
54
import org.jspecify.annotations.NullMarked;
6-
import org.jspecify.annotations.Nullable;
75

86
@NullMarked
97
public interface PathToTreeScanner {
108

11-
TreeEntry scan(Path fileOrDir, @Nullable Predicate<Path> filter);
9+
TreeEntry scan(Path fileOrDir);
1210

1311
/**
1412
* Creates a new path handler with given options.

src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/ScanningOptions.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import java.nio.file.Path;
44
import java.util.Comparator;
5+
import java.util.function.Predicate;
56
import java.util.function.ToIntFunction;
67
import org.jspecify.annotations.NullMarked;
8+
import org.jspecify.annotations.Nullable;
79

810
@NullMarked
911
public interface ScanningOptions {
@@ -14,4 +16,7 @@ public interface ScanningOptions {
1416

1517
Comparator<Path> pathComparator();
1618

19+
@Nullable
20+
Predicate<Path> pathFilter();
21+
1722
}

0 commit comments

Comments
 (0)