diff --git a/.github/workflows/create-github-release.yaml b/.github/workflows/create-github-release.yaml
new file mode 100644
index 0000000..957cb29
--- /dev/null
+++ b/.github/workflows/create-github-release.yaml
@@ -0,0 +1,141 @@
+name: Create Github release
+
+on:
+ push:
+ tags:
+ - "v*.*.*" # triggers on tags like vX.Y.Z
+
+jobs:
+
+ run-only-on-main-branch:
+ name: Verify main branch
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Check if tag is on main
+ run: |
+ git fetch origin main
+ if git merge-base --is-ancestor $GITHUB_SHA origin/main; then
+ echo "Tag is on main"
+ else
+ echo "Tag is NOT on main, skipping"
+ #exit 1
+ fi
+
+ build-native:
+ name: Build on ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ needs: run-only-on-main-branch
+ strategy:
+ matrix:
+ os: [windows-latest, ubuntu-latest, macos-latest]
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up GraalVM
+ uses: graalvm/setup-graalvm@eec48106e0bf45f2976c2ff0c3e22395cced8243
+ with:
+ java-version: "21"
+ distribution: "graalvm"
+
+ - name: Build native image
+ run: mvn -B clean package -Pnative
+
+ - name: Locate built executable
+ id: find_exe
+ shell: bash
+ run: |
+ mkdir dist
+
+ OS_NAME=${{ matrix.os }}
+ if [[ "$OS_NAME" == "windows-latest" ]]; then
+ BIN_PATH=$(find jfiletreeprettyprinter-cli/target -type f -name "jfiletreeprettyprinter.exe")
+ else
+ BIN_PATH=$(find jfiletreeprettyprinter-cli/target -type f -name "jfiletreeprettyprinter")
+ fi
+
+ echo "Found binary: $BIN_PATH"
+ cp "$BIN_PATH" dist/
+ echo "bin_path=$BIN_PATH" >> $GITHUB_OUTPUT
+
+ - name: Zip executable
+ id: zip_exe
+ shell: bash
+ run: |
+ VERSION=${GITHUB_REF_NAME}
+ OS_NAME=${{ matrix.os }}
+ case "$OS_NAME" in
+ ubuntu-latest) SAFE_OS_NAME="linux" ;;
+ windows-latest) SAFE_OS_NAME="windows" ;;
+ macos-latest) SAFE_OS_NAME="macos" ;;
+ *) SAFE_OS_NAME="$OS_NAME" ;;
+ esac
+ ZIP_NAME="jfiletreeprettyprinter-${VERSION}-${SAFE_OS_NAME}.zip"
+ echo "Zip to create: $ZIP_NAME"
+
+ cd dist
+ if [[ "$SAFE_OS_NAME" == "windows" ]]; then
+ powershell Compress-Archive -Path * -DestinationPath "$ZIP_NAME"
+ else
+ tar -a -c -f "$ZIP_NAME" *
+ fi
+ echo "zip_path=dist/$ZIP_NAME" >> $GITHUB_OUTPUT
+ cd ..
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: release-zips-${{ matrix.os }}
+ path: ${{ steps.zip_exe.outputs.zip_path }}
+
+ release:
+ name: Create GitHub Release
+ runs-on: ubuntu-latest
+ needs: build-native
+ permissions:
+ contents: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Download build artifacts
+ uses: actions/download-artifact@v4
+ with:
+ path: release_zips
+
+ - name: Extract changelog for current version
+ id: changelog
+ shell: bash
+ run: |
+ TAG="${GITHUB_REF_NAME#v}" # Remove leading "v" (e.g. vX.Y.Z → X.Y.Z)
+ echo "Extracting changelog for version $TAG"
+
+ # Extract section for this version up to the next version header
+ awk "/## \\[$TAG\\]/,/^---/" CHANGELOG.md > release_notes.tmp
+
+ # Clean up formatting (remove trailing ---)
+ sed -i '/^---/d' release_notes.tmp
+
+ # Verify
+ echo "==== Extracted release notes ===="
+ cat release_notes.tmp
+ echo "================================"
+
+ echo "body_path=release_notes.tmp" >> $GITHUB_OUTPUT
+
+ - name: Create GitHub Release
+ uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090
+ with:
+ name: "JFileTreePrettyPrinter ${{ github.ref_name }}"
+ body_path: ${{ steps.changelog.outputs.body_path }}
+ files: release_zips/**/*.zip
+ draft: true
+ prerelease: false
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/publish-maven-release.yml
similarity index 89%
rename from .github/workflows/release.yml
rename to .github/workflows/publish-maven-release.yml
index f8d1d66..042070a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/publish-maven-release.yml
@@ -50,7 +50,7 @@ jobs:
- name: Update pom.xml to release version
run: |
- mvn versions:set -DnewVersion=${{ env.RELEASE_VERSION }} -B -q
+ mvn versions:set-property -Dproperty=revision -DnewVersion=${{ env.RELEASE_VERSION }} -B -q
git commit -am "Set version to ${{ env.RELEASE_VERSION }}" || echo "No changes"
git push origin HEAD:main
env:
@@ -60,7 +60,7 @@ jobs:
run: mvn clean verify -B
- name: Publish RELEASE to Maven Central
- run: mvn deploy -P release -B -DskipTests
+ run: mvn deploy -pl jfiletreeprettyprinter-core -P release -B -DskipTests
env:
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
@@ -73,6 +73,6 @@ jobs:
NEXT_PATCH=$((PATCH+1))
NEXT_VERSION="$MAJOR.$MINOR.$NEXT_PATCH-SNAPSHOT"
echo "NEXT_VERSION=$NEXT_VERSION" >> $GITHUB_ENV
- mvn versions:set -DnewVersion=$NEXT_VERSION -B -q
+ mvn versions:set-property -Dproperty=revision -DnewVersion=$NEXT_VERSION -B -q
git commit -am "Set version to $NEXT_VERSION" || echo "No changes"
git push origin HEAD:main
diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml
index 7d24ed6..e7f3028 100644
--- a/.github/workflows/snapshot.yml
+++ b/.github/workflows/snapshot.yml
@@ -37,7 +37,7 @@ jobs:
- name: Publish SNAPSHOT to Maven Central
run: |
- mvn -P release --batch-mode deploy -am -DskipTests
+ mvn -pl jfiletreeprettyprinter-core -P release --batch-mode deploy -am -DskipTests
env:
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml
index 2166a05..40f7313 100644
--- a/.github/workflows/sonarcloud.yml
+++ b/.github/workflows/sonarcloud.yml
@@ -44,4 +44,6 @@ jobs:
- name: Build and analyze
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.host.url="https://sonarcloud.io" -Dsonar.organization=computerdaddyguy -Dsonar.projectKey=ComputerDaddyGuy_JFileTreePrettyPrinter
\ No newline at end of file
+ run: |
+ mvn clean install
+ mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index f305b0d..dbf0a93 100644
--- a/.gitignore
+++ b/.gitignore
@@ -61,4 +61,5 @@ target/failsafe-reports/
.github/workflows/cache/
# Specific
-!/src/example/resources/emojis/**
+.flattened-pom.xml
+!**/src/*/resources/emojis/**
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8dacc86..fc099f3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,27 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+---
+## [0.2.0] - 2025-11-12 - Native executable
+
+> [!IMPORTANT]
+> Maven artifactId of Java lib changed from `jfiletreeprettyprinter` to `jfiletreeprettyprinter-core`
+
+### Added
+- Run JFileTreePrettyPrinter in command line, using native executable on Windows, Linux, MacOS (see Github release attachments):
+`$ jfiletreeprettyprinter myFolder`
+- Scanning and rendering options in external file:
+`$ jfiletreeprettyprinter myFolder --options myOptions.json`
+
+### Changed
+- Split code into 3 sub-modules: cli, core and examples
+
+---
+## [0.1.1] - 2025-11-08 - Native executable (POC)
+
+> [!CAUTION]
+> Do not use this version (was for proof of concept only).
+
---
## [0.1.0] - 2025-10-13 - First beta release
diff --git a/README.md b/README.md
index 2ad1993..62c78ed 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
[](https://javadoc.io/doc/io.github.computerdaddyguy/jfiletreeprettyprinter)
[](https://github.com/computerdaddyguy/jfiletreeprettyprinter/blob/main/LICENSE)
-**A lightweight and flexible Java library to pretty-print directory structures — ideal for documentation, project overviews, or CLI tools.**
+**A lightweight and flexible Java library with a native CLI to pretty-print directory structures - ideal for documentation, project overviews, or CLI tools.**
Supports various [options](#customization-options) to customize the directories scanning and rendering:
- Filtering & sorting files and folders
@@ -21,20 +21,22 @@ Supports various [options](#customization-options) to customize the directories
> [!NOTE]
> JFileTreePrettyPrinter is perfect to explain your project structure!
-> See ProjectStructure.java to read the code that generated the tree from the below picture.
+> See ProjectStructure.java to read the code that generated the tree from the below picture.
-
+
-> [!IMPORTANT]
-> Complete documentation available in [wiki](https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter/wiki).
-
* [Why use JFileTreePrettyPrinter?](#why-use-jfiletreeprettyprinter)
-* [Requirements](#requirements)
-* [Import dependency](#import-dependency)
-* [Basic usage](#basic-usage)
-* [Customization options](#customization-options)
+* [Java lib](#java-lib)
+ * [Requirements](#requirements)
+ * [Import dependency](#import-dependency)
+ * [Basic usage](#basic-usage)
+ * [Customization options](#customization-options)
+* [Native CLI](#native-cli)
+ * [Download and install](#download-and-install)
+ * [Usage](#cli-usage)
+ * [Options](#cli-options)
* [Project Information](#project-information)
# Why use JFileTreePrettyPrinter?
@@ -44,27 +46,29 @@ Unlike a plain recursive `Files.walk()`, this library:
- Supports **dynamic child limits** and **custom extensions** per line.
- Is **dependency-free** (on runtime) and compatible with **Java 21+**.
-# Requirements
+# Java lib
+
+## Requirements
- **Java 21 or later**
-- No runtime dependencies
+- No runtime dependencies!
-# Import dependency
+## Import dependency
For Maven, import this dependency to your `pom.xml`:
```xml
io.github.computerdaddyguy
- jfiletreeprettyprinter
- 0.1.0
+ jfiletreeprettyprinter-core
+ 0.1.1
```
For Gradle:
```groovy
-implementation "io.github.computerdaddyguy:jfiletreeprettyprinter:0.1.0"
+implementation "io.github.computerdaddyguy:jfiletreeprettyprinter-core:0.1.1"
```
-# Basic usage
+## Basic usage
```java
// Example: BasicUsage.java
var printer = FileTreePrettyPrinter.createDefault(); // Create a printer with default options
@@ -94,7 +98,9 @@ base/
> [!NOTE]
> In case of error while reading directories or files, an [UncheckedIOException](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/UncheckedIOException.html) is thrown.
-# Customization options
+## Customization options
+> [!NOTE]
+> All code below is availabe in [jfiletreeprettyprinter-examples] submodule.(jfiletreeprettyprinter-examples\src\main\java\io\github\computerdaddyguy\jfiletreeprettyprinter\example)
* [Filtering](#filtering)
* [Sorting](#sorting)
@@ -105,7 +111,7 @@ base/
* [Max depth](#max-depth)
* [Tree format](#tree-format)
-## Filtering
+### Filtering
Files and directories can be selectively included or excluded using a custom `PathMatcher`.
Filtering applies independently to files and directories. Files are filtered only if their parent directory passes the directory filter.
@@ -139,7 +145,7 @@ filtering/
└─ file_A.java
```
-## Sorting
+### Sorting
Files and directories can be sorted using a custom comparator (default is alphabetical order).
If the provided comparator considers two paths equal (i.e., returns `0`), an alphabetical comparator is applied as a tie-breaker to ensure consistent results across all systems.
@@ -166,9 +172,10 @@ sorting/
└─ y_file
```
-## Emojis ❤️
+### Emojis ❤️
You can choose to use default built-in emojis, or define your own emoji mapping.
-Folders use the 📂 emoji, and files will have an emoji depending on their extension (when applicable).
+Folders use the 📂 emoji, and files will have an emoji depending on their name or extension (when applicable).
+Define your own emoji mappings with the `EmojiMapping` class!
```java
// Example: Emojis.java
@@ -194,7 +201,7 @@ var prettyPrinter = FileTreePrettyPrinter.builder()
└─ 🎬 file.avi
```
-## Child limit
+### Child limit
You can set a fixed limit to the number of children displayed for each directory. Each directory and file that pass the filter (if set) counts for one.
```java
@@ -250,7 +257,7 @@ child_limit_dynamic/
└─ ...
```
-## Line extension
+### Line extension
You can extend each displayed path with additional information by providing a custom `Function`.
This is useful to annotate your tree with comments, display file sizes, or add domain-specific notes.
@@ -290,7 +297,7 @@ line_extension/
└─ application.properties // Config file
```
-## Compact directories
+### Compact directories
Directory chains with a single child directory are fully expanded by default, but you can inline them into a single tree entry.
```java
@@ -310,7 +317,7 @@ single_directory_child/
└─ file3
```
-## Max depth
+### Max depth
You can customize the default max depth (default is 20).
```java
@@ -332,7 +339,7 @@ max_depth/
└─ ... (max depth reached)
```
-## Tree format
+### Tree format
Choose between different built-in tree formats, or create your own.
The default is `UNICODE_BOX_DRAWING`, supported by all terminals, but you can also switch to use `CLASSIC_ASCII`.
@@ -351,6 +358,90 @@ tree_format/
|-- subFile_1
`-- subFile_2
```
+# Native CLI
+
+## Download and install
+You can download the latest CLI release directly from https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter/releases/latest.
+Choose the archive for your platform (Windows, Linux, or macOS), download it, and unzip it anywhere on your system.
+
+> [!NOTE]
+> If desired, add the executable’s folder to your system’s `PATH` variable to run it from any directory.
+
+## CLI usage
+To pretty-print a folder and its contents, simply run:
+```bash
+$ jfiletreeprettyprinter
+```
+Example:
+```bash
+$ jfiletreeprettyprinter jfiletreeprettyprinter-examples/src/main/resources/base/
+base/
+├─ businessPlan.pdf
+├─ businessProject.pdf
+├─ cars/
+│ ├─ Ferrari.doc
+│ └─ Porsche.doc
+├─ diyIdeas.docx
+├─ giftIdeas.txt
+└─ images/
+ ├─ funnyCat.gif
+ ├─ holidays/
+ │ ├─ meAtTheBeach.jpeg
+ │ └─ meAtTheZoo.jpeg
+ └─ landscape.jpeg
+```
+
+To get an overview of the CLI’s capabilities and available options:
+```bash
+$ jfiletreeprettyprinter --help
+Usage: prettyprint [-dhV] [-o] []
+Pretty-prints directory structure
+ [] The path to pretty print
+ -d, --debug debug mode
+ -h, --help Show this help message and exit.
+ -o, --options the options file
+ -V, --version Print version information and exit.
+```
+
+### UTF-8 console
+If the tree symbols appear as garbled characters (e.g., Ôöé instead of ├─), your console is likely not using UTF-8 encoding.
+
+**Set UTF-8 Encoding**
+```
+# Windows
+> chcp 65001
+
+# Linux (bash, zsh)
+$ export LANG=en_US.UTF-8
+
+# macOS (bash, zsh)
+$ export LC_CTYPE=UTF-8
+```
+
+## CLI options
+The native CLI supports (almost all) pretty print options through an external JSON or YAML configuration file provided as an argument.
+
+This configuration file must comply with the [CLI options file schema](jfiletreeprettyprinter-cli/src/main/resources/schemas/jfiletreeprettyprinter-options.schema.json).
+```bash
+$ jfiletreeprettyprinter myFolder --options myOptions.json
+```
+
+See an [example file](jfiletreeprettyprinter-examples/src/main/resources/cli/options/full-options.yaml).
+
+### Options lookup order
+If no options file is explicitly provided as argument, the CLI automatically searches for one in the following order:
+1. **Inside the target path:**
+A `.prettyprint` file located within the directory being printed.
+1. **Beside the executable:**
+A `.prettyprint` file in the same folder as the native executable.
+1. **In the user’s home directory:**
+A `.prettyprint` file located in the user’s home folder.
+1. **Fallback:**
+If no configuration file is found, default options are used —
+equivalent to `PrettyPrintOptions.createDefault()`.
+
+> [!TIP]
+> Using a `.prettyprint` file allows each project or directory to define its own display style — no need to pass extra parameters each time.
# Project Information
diff --git a/ROADMAP.md b/ROADMAP.md
index c2946ad..935ea28 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -28,15 +28,16 @@
- [x] SonarCloud integration
- [x] **Workflows & lifecycle**
- [x] Github actions
- - [x] Publish `0.0.x` alpha on Maven Central!
- - [x] Publish `0.x.0` beta on Maven Central!
+ - [x] Publish `0.0.x` **alpha** on Maven Central!
+ - [x] Publish `0.x.0` **beta** on Maven Central!
+- [x] **Native CLI**
+ - [x] Options in external file
+ - [x] Distribute executable file with release in Github
## To do
- [ ] Gather feedback
## Backlog / To analyze / To implement if requested
-- [ ] Export options to/import options from external file
-- [ ] Executable file distributed with release files in Github
- [ ] Rework/fix Github wiki to be up to date
- [ ] Refactor unit tests (custom assert?)
- [ ] Option: Follow symlink
diff --git a/assets/project-structure.png b/assets/project-structure.png
index 68b8e4b..80064bf 100644
Binary files a/assets/project-structure.png and b/assets/project-structure.png differ
diff --git a/docs/How-to-build-a-native-executable-locally.md b/docs/How-to-build-a-native-executable-locally.md
new file mode 100644
index 0000000..24d1f66
--- /dev/null
+++ b/docs/How-to-build-a-native-executable-locally.md
@@ -0,0 +1,31 @@
+# How to build a native executable locally
+
+## Windows
+1. Install `GraalVM`: https://www.graalvm.org/downloads/
+ 1. Configure environment variable:
+ ```
+ GRAALVM_HOME=
+ GRAALVM_PATH=%GRAALVM_HOME%\bin
+ ```
+1. Install `Visual Studio Code`: https://visualstudio.microsoft.com/fr/downloads/
+ 1. IMPORTANT: Be sure to install `Desktop development with C++` to avoid `Failed to find a suitable version of Visual Studio with 'vswhere.exe'` error
+1. Configure Maven plugin: https://graalvm.github.io/native-build-tools/latest/end-to-end-maven-guide.html#add-plugin
+ 1. Use `native` profile
+ 1. Set `native.maven.plugin.version` property to latest version from https://mvnrepository.com/artifact/org.graalvm.buildtools/native-maven-plugin
+ 1. Set appropriate main class
+1. From the project root, run `mvn -Pnative package`
+1. After a few seconds, `jfiletreeprettyprinter.exe` has been generated inside `target/` folder
+
+### UTF-8 console
+If printed tree format looks like `Ôöé` instead of `├─`, then your console is likely not configured to UTF-8 encoding.
+To configure your console to UTF-8 code page, run:
+```
+chcp 65001
+```
+More info on [chcp Windows command](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/chcp).
+
+## Linux
+No doc for now.
+
+## MacOS
+No doc for now.
\ No newline at end of file
diff --git a/release_process.md b/docs/Release-process.md
similarity index 53%
rename from release_process.md
rename to docs/Release-process.md
index 9dfd641..bf9a5e4 100644
--- a/release_process.md
+++ b/docs/Release-process.md
@@ -1,4 +1,4 @@
-# JFileTreePrettyPrinter release flow
+# JFileTreePrettyPrinter release process
- **In `develop` branch:**
- Run tests
@@ -10,17 +10,22 @@
- **In `main` branch:**
- Set project version in `pom.xml` to `X.Y.Z` (remove the `-SNAPSHOT`)
- Update `README.md` (with new `X.Y.Z` dependency version)
- - Update `CHANGELOG.md` with changes
+ - Update `CHANGELOG.md` with changes **!IMPORTANT: Respect format!**
- Update `ROADMAP.md` if necessary
- Update `SECURITY.md` if necessary
- Commit locally
- Tag with appropriate `vX.Y.Z`
- - Push code & tags
+ - Push code & tag
- **In Github:**
- - Create new release based on `vX.Y.Z` tag: copy content of `CHANGELOG.md` for this version
- - Github `release` workflow will run automatically
- - Few minutes later, artifact is available on Maven Central 🎉
+ - Action `create-github-release` triggers automatically on tag push `vX.Y.Z` on `main` branch
+ - Builds native executables for Linux/Windows/MacOS
+ - Creates a **draft** Github release with:
+ - Executables as attached zipped files
+ - Appropriate section of `CHANGELOG.md` for this version
+ - Review the Github release and **publish it manually**
+ - Github `publish-maven-release` workflow will run automatically
+ - Few minutes later, artifact is available on Maven Central 🎉
- Update wiki if required
- **Merge `main` back into `develop` branch**
diff --git a/jfiletreeprettyprinter-cli/pom.xml b/jfiletreeprettyprinter-cli/pom.xml
new file mode 100644
index 0000000..9a610ca
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/pom.xml
@@ -0,0 +1,130 @@
+
+ 4.0.0
+
+ io.github.computerdaddyguy
+ jfiletreeprettyprinter
+ ${revision}
+
+
+ jfiletreeprettyprinter-cli
+
+ jar
+
+
+
+
+ io.github.computerdaddyguy
+ jfiletreeprettyprinter-core
+ ${revision}
+
+
+
+ org.jspecify
+ jspecify
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+
+ tools.jackson.core
+ jackson-databind
+
+
+ tools.jackson.dataformat
+ jackson-dataformat-yaml
+
+
+ org.hibernate.validator
+ hibernate-validator
+
+
+ info.picocli
+ picocli
+
+
+
+
+
+
+
+
+ io.github.git-commit-id
+ git-commit-id-maven-plugin
+
+
+ get-the-git-infos
+
+ revision
+
+ initialize
+
+
+
+ false
+ full
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ true
+ false
+
+
+ ${git.build.time}
+ ${git.commit.id.full}
+ ${git.commit.time}
+ ${project.description}
+ ${scm.url}
+
+
+
+
+
+
+
+
+
+
+
+ native
+
+
+
+ org.graalvm.buildtools
+ native-maven-plugin
+ ${native.maven.plugin.version}
+ true
+
+
+ build-native
+
+ compile-no-fork
+
+ package
+
+
+
+ io.github.computerdaddyguy.jfiletreeprettyprinter.cli.FileTreePrettyPrinterCommandLine
+ jfiletreeprettyprinter
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/FileTreePrettyPrinterCommandLine.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/FileTreePrettyPrinterCommandLine.java
new file mode 100644
index 0000000..eed3053
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/FileTreePrettyPrinterCommandLine.java
@@ -0,0 +1,43 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.exception.DefaultExecutionExceptionHandler;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io.ConsoleOutput;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.OptionsLoader;
+import java.util.Objects;
+import org.jspecify.annotations.NullMarked;
+import picocli.CommandLine;
+import picocli.CommandLine.IExecutionExceptionHandler;
+
+@NullMarked
+class FileTreePrettyPrinterCommandLine {
+
+ private final CommandLine cmd;
+
+ FileTreePrettyPrinterCommandLine(ConsoleOutput output, OptionsLoader optionsLoader, IExecutionExceptionHandler exHandler) {
+ super();
+ Objects.requireNonNull(output, "output is null");
+ Objects.requireNonNull(optionsLoader, "optionsLoader is null");
+ Objects.requireNonNull(exHandler, "exHandler is null");
+
+ cmd = new CommandLine(new PrettyPrintCommand(output, optionsLoader));
+ cmd.setExecutionExceptionHandler(exHandler);
+ }
+
+ int executeCommand(String[] args) {
+ return cmd.execute(args);
+ }
+
+ // -------------------------------------------------------------------------------
+
+ public static void main(String[] args) {
+
+ var output = ConsoleOutput.createDefault();
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ System.exit(cli.executeCommand(args));
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/ManifestVersionProvider.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/ManifestVersionProvider.java
new file mode 100644
index 0000000..7a9b242
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/ManifestVersionProvider.java
@@ -0,0 +1,43 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli;
+
+import java.io.InputStream;
+import java.util.jar.Manifest;
+import picocli.CommandLine.IVersionProvider;
+
+class ManifestVersionProvider implements IVersionProvider {
+
+ @Override
+ public String[] getVersion() throws Exception {
+ String implVersion = null;
+ String projectDesc = null;
+ String commitId = null;
+ String commitTime = null;
+ String scmUrl = null;
+ String buildTime = null;
+
+ try (InputStream is = getClass().getResourceAsStream("/META-INF/MANIFEST.MF")) {
+ if (is != null) {
+ Manifest manifest = new Manifest(is);
+ implVersion = manifest.getMainAttributes().getValue("Implementation-Version");
+ projectDesc = manifest.getMainAttributes().getValue("Project-Desc");
+ commitId = manifest.getMainAttributes().getValue("Commit-Id");
+ commitTime = manifest.getMainAttributes().getValue("Commit-Time");
+ scmUrl = manifest.getMainAttributes().getValue("Scm-Url");
+ buildTime = manifest.getMainAttributes().getValue("Build-Time");
+ }
+ }
+
+ return new String[] {
+ "JFileTreePrettyPrinter " + valueOrUnknown(implVersion),
+ valueOrUnknown(projectDesc),
+ "Repository: " + valueOrUnknown(scmUrl),
+ "Commit: " + valueOrUnknown(commitId) + " (" + valueOrUnknown(commitTime) + ")",
+ "Built on: " + valueOrUnknown(buildTime)
+ };
+ }
+
+ private static final String valueOrUnknown(String value) {
+ return value != null ? value : "unknown";
+ }
+
+}
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/PrettyPrintCommand.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/PrettyPrintCommand.java
new file mode 100644
index 0000000..adb4cc4
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/PrettyPrintCommand.java
@@ -0,0 +1,85 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io.ConsoleOutput;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.OptionsLoader;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions;
+import java.io.File;
+import java.nio.file.Path;
+import java.util.Objects;
+import java.util.concurrent.Callable;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Option;
+import picocli.CommandLine.Parameters;
+
+// @formatter:off
+@Command(
+ name = "prettyprint",
+ mixinStandardHelpOptions = true,
+ versionProvider = ManifestVersionProvider.class,
+ description = "Pretty-prints directory structure"
+)
+// @formatter:on
+@NullMarked
+class PrettyPrintCommand implements Callable {
+
+ private final ConsoleOutput output;
+ private final OptionsLoader optionsLoader;
+
+ public PrettyPrintCommand(ConsoleOutput output, OptionsLoader optionsLoader) {
+ this.output = Objects.requireNonNull(output, "output is null");
+ this.optionsLoader = Objects.requireNonNull(optionsLoader, "optionsLoader is null");
+ }
+
+ // ---------- CLI args ----------
+
+ @Nullable
+ @Parameters(index = "0", description = "The path to pretty print", arity = "0..1")
+ private File target;
+
+ @Nullable
+ @Option(names = { "-o", "--options" }, paramLabel = "OPTIONS", description = "the options file", arity = "0")
+ private File optionsFile;
+
+ @Option(names = { "-d", "--debug" }, description = "debug mode")
+ private boolean debug;
+
+ // ---------- Command ----------
+
+ @Override
+ public Integer call() throws Exception {
+
+ output.enableDebug(this.debug);
+
+ var targetPath = detectTargetPath(output);
+ if (!targetPath.toFile().exists()) {
+ output.printError("Path not found: %s", targetPath);
+ return 1;
+ }
+
+ Path optionsPath = optionsFile == null ? null : optionsFile.toPath().toAbsolutePath().normalize();
+ PrettyPrintOptions options = optionsLoader.loadOptions(targetPath, optionsPath);
+
+ var printer = FileTreePrettyPrinter.builder().withOptions(options).build();
+ var result = printer.prettyPrint(targetPath);
+ output.print(result);
+
+ return 0;
+ }
+
+ private Path detectTargetPath(ConsoleOutput output) {
+ Path path = null;
+ if (target != null) {
+ path = target.toPath();
+ } else {
+ output.printDebug("No target provided: use current directory");
+ path = Path.of(".");
+ }
+ path = path.toAbsolutePath().normalize();
+ output.printDebug("Target path: %s", path);
+ return path;
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/RecordUtils.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/RecordUtils.java
new file mode 100644
index 0000000..b126354
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/RecordUtils.java
@@ -0,0 +1,82 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+
+@NullMarked
+public class RecordUtils {
+
+ private RecordUtils() {
+ // Helper class
+ }
+
+ /**
+ * Inspired from: https://sormuras.github.io/blog/2020-05-06-records-to-text-block.html
+ */
+ public static String toTextBlock(@Nullable Record rec) {
+ if (rec == null) {
+ return "null";
+ }
+ var lines = new ArrayList();
+ toTextBlock(lines, "", null, rec, " ");
+ return String.join(System.lineSeparator(), lines);
+ }
+
+ private static void toTextBlock(List lines, String shift, @Nullable String attrName, @Nullable Object value, String indent) {
+ if (value == null) {
+ return; // do not print null objects, just ignore them
+ }
+ if (value.getClass().isRecord()) {
+ toTextBlockRecord(lines, shift, attrName, (Record) value, indent);
+ } else if (value instanceof Collection> coll) {
+ toTextBlockCollection(lines, shift, attrName, coll, indent);
+ } else {
+ lines.add(String.format("%s%s: %s", shift, attrName, toSingleValue(value)));
+ }
+ }
+
+ private static void toTextBlockRecord(List lines, String shift, @Nullable String attrName, Record rec, String indent) {
+ if (attrName == null) {
+ lines.add(String.format("%s%s", shift, rec.getClass().getSimpleName()));
+ } else {
+ lines.add(String.format("%s%s -> %s", shift, attrName, rec.getClass().getSimpleName()));
+ }
+
+ var components = rec.getClass().getRecordComponents();
+
+ for (var component : components) {
+ var compName = component.getName();
+ try {
+ var value = component.getAccessor().invoke(rec);
+ toTextBlock(lines, shift + indent, compName, value, indent);
+ } catch (ReflectiveOperationException e) {
+ lines.add("// Reflection over " + component + " failed: " + e);
+ }
+ }
+ }
+
+ private static void toTextBlockCollection(List lines, String shift, @Nullable String attrName, Collection> coll, String indent) {
+ if (attrName == null) {
+ lines.add(String.format("%s[", shift));
+ } else {
+ lines.add(String.format("%s%s: [", shift, attrName));
+ }
+ int i = 0;
+ for (var item : coll) {
+ toTextBlock(lines, shift + indent, "[" + i + "]", item, indent);
+ i++;
+ }
+ lines.add(String.format("%s]", shift));
+ }
+
+ private static String toSingleValue(Object value) {
+ if (value instanceof String str) {
+ return String.format("\"%s\"", str);
+ }
+ return String.format("%s", value);
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/exception/DefaultExecutionExceptionHandler.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/exception/DefaultExecutionExceptionHandler.java
new file mode 100644
index 0000000..b975ff3
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/exception/DefaultExecutionExceptionHandler.java
@@ -0,0 +1,50 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.exception;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io.ConsoleOutput;
+import jakarta.validation.ConstraintViolationException;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import org.jspecify.annotations.NullMarked;
+import picocli.CommandLine;
+import picocli.CommandLine.IExecutionExceptionHandler;
+import picocli.CommandLine.ParseResult;
+
+@NullMarked
+public class DefaultExecutionExceptionHandler implements IExecutionExceptionHandler {
+
+ private final ConsoleOutput output;
+
+ public DefaultExecutionExceptionHandler(ConsoleOutput output) {
+ this.output = Objects.requireNonNull(output, "output is null");
+ }
+
+ @Override
+ public int handleExecutionException(Exception ex, CommandLine commandLine, ParseResult fullParseResult) throws Exception {
+ return switch (ex) {
+ case ExternalOptionsException extOptionEx -> handleExternalOptionsException(extOptionEx);
+ case ConstraintViolationException violationEx -> handleConstraintViolationException(violationEx);
+ default -> handleDefaultException(ex);
+ };
+ }
+
+ private int handleExternalOptionsException(ExternalOptionsException e) {
+ output.printError(e.getMessage() + ": " + e.getOptionsPath().toString());
+ return 1;
+ }
+
+ private int handleConstraintViolationException(ConstraintViolationException e) {
+ output.printError(
+ "Invalid options file:" + System.lineSeparator() +
+ e.getConstraintViolations().stream()
+ .map(violation -> " -> " + violation.getPropertyPath() + ": " + violation.getMessage())
+ .collect(Collectors.joining(System.lineSeparator()))
+ );
+ return 1;
+ }
+
+ private int handleDefaultException(Exception e) {
+ output.printError("Error while pretty printing: " + e.getMessage());
+ return 1;
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/exception/ExternalOptionsException.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/exception/ExternalOptionsException.java
new file mode 100644
index 0000000..56725f3
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/exception/ExternalOptionsException.java
@@ -0,0 +1,28 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.exception;
+
+import java.nio.file.Path;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+
+@NullMarked
+public class ExternalOptionsException extends RuntimeException {
+
+ @Nullable
+ private final transient Path optionsPath;
+
+ public ExternalOptionsException(@Nullable Path optionsPath, String message, Throwable cause) {
+ super(message, cause);
+ this.optionsPath = optionsPath;
+ }
+
+ public ExternalOptionsException(@Nullable Path optionsPath, String message) {
+ super(message);
+ this.optionsPath = optionsPath;
+ }
+
+ @Nullable
+ public Path getOptionsPath() {
+ return optionsPath;
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/io/ConsoleOutput.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/io/ConsoleOutput.java
new file mode 100644
index 0000000..f281e2d
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/io/ConsoleOutput.java
@@ -0,0 +1,25 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io;
+
+import org.jspecify.annotations.NullMarked;
+
+/**
+ * An interface abstracting the console output - usefull to unit test the CLI output!
+ */
+@NullMarked
+public interface ConsoleOutput {
+
+ boolean isDebugEnabled();
+
+ void enableDebug(boolean enabled);
+
+ void print(String msg, Object... args);
+
+ void printDebug(String msg, Object... args);
+
+ void printError(String msg, Object... args);
+
+ public static ConsoleOutput createDefault() {
+ return new DefaultConsoleOutput(System.out, System.err);
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/io/DefaultConsoleOutput.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/io/DefaultConsoleOutput.java
new file mode 100644
index 0000000..2b2852c
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/io/DefaultConsoleOutput.java
@@ -0,0 +1,76 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io;
+
+import java.io.PrintStream;
+import java.util.Objects;
+import java.util.logging.Logger;
+import org.jspecify.annotations.NullMarked;
+
+@NullMarked
+public class DefaultConsoleOutput implements ConsoleOutput {
+
+ private static final Logger ROOT_LOGGER = Logger.getLogger("");
+
+ private boolean debug;
+ private final PrintStream out;
+ private final PrintStream err;
+
+ public DefaultConsoleOutput(PrintStream out, PrintStream err) {
+ this.out = Objects.requireNonNull(out, "out stream is null");
+ this.err = Objects.requireNonNull(err, "err stream is null");
+ disableAllLoggers();
+ }
+
+ /**
+ * Require otherwise some embedded loggers (i.e. (Hibernate validator) print in the console.
+ */
+ private void disableAllLoggers() {
+ ROOT_LOGGER.setLevel(java.util.logging.Level.OFF);
+ Logger.getGlobal().setLevel(java.util.logging.Level.OFF);
+ Logger.getLogger("org.hibernate.validator").setLevel(java.util.logging.Level.OFF);
+ }
+
+ // ---------------------------------------------------------
+
+ @Override
+ public boolean isDebugEnabled() {
+ return this.debug;
+ }
+
+ @Override
+ public void enableDebug(boolean enabled) {
+ this.debug = enabled;
+ }
+
+ @Override
+ public void print(String msg, Object... args) {
+ printOut(msg, args);
+ }
+
+ @Override
+ public void printDebug(String msg, Object... args) {
+ // Could not (yet) make Logger level work within native image, so fallback to plain console output (for now)
+ if (debug) {
+ printOut("[DEBUG] " + msg, args);
+ }
+ }
+
+ @Override
+ public void printError(String msg, Object... args) {
+ printErr("[ERROR] " + msg, args);
+ }
+
+ // ---------------------------------------------------------
+
+ private void printOut(String msg, Object... args) {
+ printfln(out, msg, args);
+ }
+
+ private void printErr(String msg, Object... args) {
+ printfln(err, msg, args);
+ }
+
+ private void printfln(PrintStream dest, String msg, Object... args) {
+ dest.printf(msg + System.lineSeparator(), args);// Because "printf" does not print line return
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/DefaultOptionsLoader.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/DefaultOptionsLoader.java
new file mode 100644
index 0000000..9a205c4
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/DefaultOptionsLoader.java
@@ -0,0 +1,32 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.mapper.ExternalOptionsMapper;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.reader.ExternalOptionsReader;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions;
+import java.nio.file.Path;
+import java.util.Objects;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+
+@NullMarked
+class DefaultOptionsLoader implements OptionsLoader {
+
+ private final ExternalOptionsReader reader;
+ private final ExternalOptionsMapper mapper;
+
+ public DefaultOptionsLoader(ExternalOptionsReader reader, ExternalOptionsMapper mapper) {
+ super();
+ this.reader = Objects.requireNonNull(reader, "reader is null");
+ this.mapper = Objects.requireNonNull(mapper, "mapper is null");
+ }
+
+ @Override
+ public PrettyPrintOptions loadOptions(Path targetPath, @Nullable Path optionsPath) {
+ var externalOptions = reader.readExternalOptions(targetPath, optionsPath);
+ if (externalOptions == null) {
+ return PrettyPrintOptions.createDefault();
+ }
+ return mapper.mapToOptions(targetPath, externalOptions);
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/OptionsLoader.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/OptionsLoader.java
new file mode 100644
index 0000000..10e0a75
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/OptionsLoader.java
@@ -0,0 +1,22 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io.ConsoleOutput;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.mapper.ExternalOptionsMapper;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.reader.ExternalOptionsReader;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions;
+import java.nio.file.Path;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+
+@NullMarked
+public interface OptionsLoader {
+
+ PrettyPrintOptions loadOptions(Path targetPath, @Nullable Path optionsPath);
+
+ public static OptionsLoader createDefault(ConsoleOutput output) {
+ var reader = ExternalOptionsReader.createDefault(output);
+ var mapper = ExternalOptionsMapper.createDefault();
+ return new DefaultOptionsLoader(reader, mapper);
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/mapper/DefaultExternalOptionsMapper.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/mapper/DefaultExternalOptionsMapper.java
new file mode 100644
index 0000000..bdb5d48
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/mapper/DefaultExternalOptionsMapper.java
@@ -0,0 +1,102 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.mapper;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ChildLimit;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ExternalOptions;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.ChildLimits;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.LineExtensions;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+
+class DefaultExternalOptionsMapper implements ExternalOptionsMapper {
+
+ @Override
+ public PrettyPrintOptions mapToOptions(Path targetPath, ExternalOptions externalOptions) {
+ var options = PrettyPrintOptions.createDefault();
+ options = mapEmojis(options, externalOptions);
+ options = mapCompactDirectories(options, externalOptions);
+ options = mapMaxDepth(options, externalOptions);
+ options = mapChildLimit(options, externalOptions, targetPath);
+ options = mapFilter(options, externalOptions, targetPath);
+ options = mapLineExtensions(options, externalOptions, targetPath);
+ return options;
+ }
+
+ private PrettyPrintOptions mapEmojis(PrettyPrintOptions options, ExternalOptions externalOptions) {
+ if (Boolean.TRUE.equals(externalOptions.emojis())) {
+ return options.withDefaultEmojis();
+ }
+ return options;
+ }
+
+ private PrettyPrintOptions mapCompactDirectories(PrettyPrintOptions options, ExternalOptions externalOptions) {
+ if (Boolean.TRUE.equals(externalOptions.compactDirectories())) {
+ return options.withCompactDirectories(true);
+ }
+ return options;
+ }
+
+ private PrettyPrintOptions mapMaxDepth(PrettyPrintOptions options, ExternalOptions externalOptions) {
+ var max = externalOptions.maxDepth();
+ if (max != null) {
+ return options.withMaxDepth(max);
+ }
+ return options;
+ }
+
+ private PrettyPrintOptions mapChildLimit(PrettyPrintOptions options, ExternalOptions externalOptions, Path targetPath) {
+ if (externalOptions.childLimit() == null) {
+ return options;
+ }
+ return switch (externalOptions.childLimit()) {
+ case ChildLimit.StaticLimit(var limit) -> options.withChildLimit(limit);
+ case ChildLimit.DynamicLimit(var limits) -> {
+ var limitBuilder = ChildLimits.builder();
+ for (var limit : limits) {
+ limitBuilder.add(mapMatcher(limit.matcher(), targetPath), limit.limit());
+ }
+ options.withChildLimit(limitBuilder.build());
+ yield options;
+ }
+ };
+ }
+
+ private PrettyPrintOptions mapFilter(PrettyPrintOptions options, ExternalOptions externalOptions, Path targetPath) {
+ if (externalOptions.filter() == null) {
+ return options;
+ }
+ if (externalOptions.filter().dir() != null) {
+ options = options.filterDirectories(mapMatcher(externalOptions.filter().dir(), targetPath));
+ }
+ if (externalOptions.filter().file() != null) {
+ options = options.filterFiles(mapMatcher(externalOptions.filter().file(), targetPath));
+ }
+ return options;
+ }
+
+ private PrettyPrintOptions mapLineExtensions(PrettyPrintOptions options, ExternalOptions externalOptions, Path targetPath) {
+ if (externalOptions.lineExtensions() == null) {
+ return options;
+ }
+ var builder = LineExtensions.builder();
+ for (var extension : externalOptions.lineExtensions()) {
+ builder.add(mapMatcher(extension.matcher(), targetPath), extension.extension());
+ }
+ return options.withLineExtension(builder.build());
+ }
+
+ private PathMatcher mapMatcher(Matcher matcher, Path targetPath) {
+ return switch (matcher) {
+ case Matcher.AlwaysTrue() -> p -> true;
+ case Matcher.AlwaysFalse() -> p -> false;
+ case Matcher.AllOf(var matchers) -> PathMatchers.allOf(matchers.stream().map(subMatcher -> mapMatcher(subMatcher, targetPath)).toList());
+ case Matcher.AnyOf(var matchers) -> PathMatchers.anyOf(matchers.stream().map(subMatcher -> mapMatcher(subMatcher, targetPath)).toList());
+ case Matcher.NoneOf(var matchers) -> PathMatchers.noneOf(matchers.stream().map(subMatcher -> mapMatcher(subMatcher, targetPath)).toList());
+ case Matcher.NameGlob(var glob) -> PathMatchers.hasNameMatchingGlob(glob);
+ case Matcher.PathGlob(var glob) -> PathMatchers.hasRelativePathMatchingGlob(targetPath, glob);
+ };
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/mapper/ExternalOptionsMapper.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/mapper/ExternalOptionsMapper.java
new file mode 100644
index 0000000..4157f50
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/mapper/ExternalOptionsMapper.java
@@ -0,0 +1,17 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.mapper;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ExternalOptions;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions;
+import java.nio.file.Path;
+import org.jspecify.annotations.NullMarked;
+
+@NullMarked
+public interface ExternalOptionsMapper {
+
+ PrettyPrintOptions mapToOptions(Path targetPath, ExternalOptions externalOptions);
+
+ static ExternalOptionsMapper createDefault() {
+ return new DefaultExternalOptionsMapper();
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/ChildLimit.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/ChildLimit.java
new file mode 100644
index 0000000..740f496
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/ChildLimit.java
@@ -0,0 +1,44 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import java.util.List;
+
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
+public sealed interface ChildLimit {
+
+ /**
+ *
+ * @param limit
+ */
+ @JsonTypeName("static")
+ public record StaticLimit(
+ @NotNull Integer limit
+ ) implements ChildLimit {
+
+ }
+
+ /**
+ *
+ */
+ @JsonTypeName("dynamic")
+ public record DynamicLimit(
+ @Valid @NotNull @NotEmpty List<@Valid @NotNull DynamicLimitItem> limits
+ ) implements ChildLimit {
+
+ }
+
+ /**
+ *
+ */
+ public record DynamicLimitItem(
+ @NotNull Integer limit,
+ @Valid @NotNull Matcher matcher
+ ) {
+
+ }
+
+}
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/ExternalOptions.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/ExternalOptions.java
new file mode 100644
index 0000000..a551caa
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/ExternalOptions.java
@@ -0,0 +1,17 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import java.util.List;
+import org.jspecify.annotations.Nullable;
+
+public record ExternalOptions(
+ @Nullable Boolean emojis,
+ @Nullable Boolean compactDirectories,
+ @Nullable Integer maxDepth,
+ @Valid @Nullable ChildLimit childLimit,
+ @Valid @Nullable Filter filter,
+ @Valid @Nullable List<@Valid @NotNull LineExtension> lineExtensions
+) {
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/Filter.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/Filter.java
new file mode 100644
index 0000000..025fff8
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/Filter.java
@@ -0,0 +1,11 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model;
+
+import jakarta.validation.Valid;
+import org.jspecify.annotations.Nullable;
+
+public record Filter(
+ @Valid @Nullable Matcher dir,
+ @Valid @Nullable Matcher file
+) {
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/LineExtension.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/LineExtension.java
new file mode 100644
index 0000000..378a3bd
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/LineExtension.java
@@ -0,0 +1,11 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+public record LineExtension(
+ @Valid @NotNull String extension,
+ @Valid @NotNull Matcher matcher
+) {
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/Matcher.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/Matcher.java
new file mode 100644
index 0000000..2031ace
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/model/Matcher.java
@@ -0,0 +1,79 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import java.util.List;
+
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
+public sealed interface Matcher {
+
+ /**
+ *
+ */
+ @JsonTypeName("everything")
+ public final record AlwaysTrue() implements Matcher {
+
+ }
+
+ /**
+ *
+ */
+ @JsonTypeName("nothing")
+ public final record AlwaysFalse() implements Matcher {
+
+ }
+
+ /**
+ *
+ */
+ @JsonTypeName("allOf")
+ public final record AllOf(
+ @Valid @NotNull @NotEmpty List<@Valid @NotNull Matcher> matchers
+ ) implements Matcher {
+
+ }
+
+ /**
+ *
+ */
+ @JsonTypeName("anyOf")
+ public final record AnyOf(
+ @Valid @NotNull @NotEmpty List<@Valid @NotNull Matcher> matchers
+ ) implements Matcher {
+
+ }
+
+ /**
+ *
+ */
+ @JsonTypeName("noneOf")
+ public final record NoneOf(
+ @Valid @NotNull @NotEmpty List<@Valid @NotNull Matcher> matchers
+ ) implements Matcher {
+
+ }
+
+ /**
+ *
+ */
+ @JsonTypeName("name")
+ public final record NameGlob(
+ @NotNull @NotEmpty String glob
+ ) implements Matcher {
+
+ }
+
+ /**
+ *
+ */
+ @JsonTypeName("path")
+ public final record PathGlob(
+ @NotNull @NotEmpty String glob
+ ) implements Matcher {
+
+ }
+
+}
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/reader/ExternalOptionsReader.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/reader/ExternalOptionsReader.java
new file mode 100644
index 0000000..e396f6e
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/reader/ExternalOptionsReader.java
@@ -0,0 +1,29 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.reader;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io.ConsoleOutput;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ExternalOptions;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.function.Function;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+
+@NullMarked
+public interface ExternalOptionsReader {
+
+ @Nullable
+ ExternalOptions readExternalOptions(Path targetPath, @Nullable Path optionsPath);
+
+ static ExternalOptionsReader createDefault(ConsoleOutput output) {
+ final String DEFAULT_OPTION_FILENAME = ".prettyprint";
+
+ var simpleReader = new SimpleExternalOptionsReader(output);
+ Function> fallbackOptionsFunction = targetPath -> List.of(
+ targetPath.resolve(DEFAULT_OPTION_FILENAME),
+ Path.of(".").resolve(DEFAULT_OPTION_FILENAME),
+ Path.of(System.getProperty("user.home")).resolve(DEFAULT_OPTION_FILENAME)
+ );
+ return new FallbackExternalOptionsReader(output, simpleReader, fallbackOptionsFunction);
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/reader/FallbackExternalOptionsReader.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/reader/FallbackExternalOptionsReader.java
new file mode 100644
index 0000000..83cf3f7
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/reader/FallbackExternalOptionsReader.java
@@ -0,0 +1,55 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.reader;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.exception.ExternalOptionsException;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io.ConsoleOutput;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ExternalOptions;
+import java.nio.file.Path;
+import java.util.Objects;
+import java.util.function.Function;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+
+@NullMarked
+class FallbackExternalOptionsReader implements ExternalOptionsReader {
+
+ private final ConsoleOutput output;
+ private final ExternalOptionsReader delegateReader;
+ private final Function> fallbackPathsFunction;
+
+ public FallbackExternalOptionsReader(ConsoleOutput output, ExternalOptionsReader delegateReader, Function> fallbackPathsFunction) {
+ super();
+ this.output = Objects.requireNonNull(output, "output is null");
+ this.delegateReader = Objects.requireNonNull(delegateReader, "delegateReader is null");
+ this.fallbackPathsFunction = Objects.requireNonNull(fallbackPathsFunction, "fallbackPathsFunction is null");
+ }
+
+ @Override
+ @Nullable
+ public ExternalOptions readExternalOptions(Path targetPath, @Nullable Path optionsPath) {
+ if (optionsPath != null) {
+ var options = delegateReader.readExternalOptions(targetPath, optionsPath);
+ if (options == null) {
+ throw new ExternalOptionsException(optionsPath, "Options file does not exist");
+ }
+ return options;
+ }
+ output.printDebug("No options file provided, looking for fallback options files...");
+ var fallbackOptions = fallbackPathsFunction.apply(targetPath);
+ return readFallbackOptions(targetPath, fallbackOptions);
+ }
+
+ @Nullable
+ private ExternalOptions readFallbackOptions(Path targetPath, Iterable fallbackOptionsPaths) {
+ for (var fallbackOptionsPath : fallbackOptionsPaths) {
+ Objects.requireNonNull(fallbackOptionsPath, "one of fallback option paths is null");
+ var options = delegateReader.readExternalOptions(targetPath, fallbackOptionsPath);
+ if (options != null) {
+ return options;
+ }
+ output.printDebug("Options file does not exist: " + fallbackOptionsPath.toString());
+ }
+ output.printDebug("No options file provided/found");
+ return null;
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/reader/SimpleExternalOptionsReader.java b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/reader/SimpleExternalOptionsReader.java
new file mode 100644
index 0000000..1a8b9df
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/options/reader/SimpleExternalOptionsReader.java
@@ -0,0 +1,81 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.reader;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.RecordUtils;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.exception.ExternalOptionsException;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io.ConsoleOutput;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ExternalOptions;
+import jakarta.validation.ConstraintViolationException;
+import jakarta.validation.Validation;
+import java.nio.file.Path;
+import java.util.Objects;
+import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator;
+import org.jspecify.annotations.NullMarked;
+import org.jspecify.annotations.Nullable;
+import tools.jackson.dataformat.yaml.YAMLMapper;
+
+@NullMarked
+class SimpleExternalOptionsReader implements ExternalOptionsReader {
+
+ private final ConsoleOutput output;
+
+ public SimpleExternalOptionsReader(ConsoleOutput output) {
+ this.output = Objects.requireNonNull(output, "output is null");
+ }
+
+ @Override
+ @Nullable
+ public ExternalOptions readExternalOptions(Path targetPath, @Nullable Path optionsPath) {
+
+ if (optionsPath == null) {
+ throw new ExternalOptionsException(optionsPath, "null options path");
+ }
+
+ optionsPath = optionsPath.toAbsolutePath().normalize();
+ var optionsFile = optionsPath.toFile();
+ if (!optionsFile.exists()) {
+ return null;
+ }
+ if (!optionsFile.isFile()) {
+ throw new ExternalOptionsException(optionsPath, "Options file is actually not a file");
+ }
+ if (!optionsFile.canRead()) {
+ throw new ExternalOptionsException(optionsPath, "Options file exist but is not readable");
+ }
+
+ output.printDebug("Options file found: %s", optionsPath);
+
+ var externalOptions = load(output, optionsPath);
+ validate(externalOptions);
+ output.printDebug("Options file is valid");
+ return externalOptions;
+ }
+
+ private ExternalOptions load(ConsoleOutput output, Path optionsPath) {
+ try {
+ var mapper = YAMLMapper.builder().build();
+ ExternalOptions externalOptions = mapper.readValue(optionsPath, ExternalOptions.class);
+
+ if (output.isDebugEnabled()) { // Trick to avoid RecordUtils.toTextBlock() to evaluate if not needed
+ output.printDebug("%s", RecordUtils.toTextBlock(externalOptions));
+ }
+ return externalOptions;
+ } catch (RuntimeException e) {
+ throw new ExternalOptionsException(optionsPath, "IO error or malformed options file", e);
+ }
+ }
+
+ private void validate(ExternalOptions externalOptions) {
+ var validatorFactory = Validation.byDefaultProvider()
+ .configure()
+ .messageInterpolator(new ParameterMessageInterpolator())
+ .buildValidatorFactory();
+ var validator = validatorFactory.getValidator();
+
+ var violations = validator.validate(externalOptions);
+ if (!violations.isEmpty()) {
+ throw new ConstraintViolationException(violations);
+ }
+
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/main/resources/META-INF/native-image/io.github.computerdaddyguy/jfiletreeprettyprinter/reachability-metadata.json b/jfiletreeprettyprinter-cli/src/main/resources/META-INF/native-image/io.github.computerdaddyguy/jfiletreeprettyprinter/reachability-metadata.json
new file mode 100644
index 0000000..8f013ea
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/resources/META-INF/native-image/io.github.computerdaddyguy/jfiletreeprettyprinter/reachability-metadata.json
@@ -0,0 +1,176 @@
+{
+ "reflection": [
+ {
+ "type": "picocli.CommandLine$AutoHelpMixin",
+ "allDeclaredConstructors": true,
+ "allDeclaredMethods": true,
+ "allDeclaredFields": true
+ },
+ {
+ "type": "picocli.CommandLine",
+ "allDeclaredConstructors": true,
+ "allDeclaredMethods": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.PrettyPrintCommand",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.ManifestVersionProvider",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ExternalOptions",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ChildLimit",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Filter",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.LineExtension",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ChildLimit$StaticLimit",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ChildLimit$DynamicLimit",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ChildLimit$DynamicLimitItem",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher$AlwaysTrue",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher$AlwaysFalse",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher$AllOf",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher$AnyOf",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher$NoneOf",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher$NameGlob",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ },
+ {
+ "type": "io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher$PathGlob",
+ "allDeclaredConstructors": true,
+ "allPublicConstructors": true,
+ "allDeclaredMethods": true,
+ "allPublicMethods": true,
+ "allDeclaredFields": true,
+ "allPublicFields": true
+ }
+ ],
+
+ "resources": [
+ {
+ "glob": "/META-INF/MANIFEST.MF"
+ }
+ ]
+
+}
+
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/main/resources/schemas/jfiletreeprettyprinter-options.schema.json b/jfiletreeprettyprinter-cli/src/main/resources/schemas/jfiletreeprettyprinter-options.schema.json
new file mode 100644
index 0000000..139905f
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/main/resources/schemas/jfiletreeprettyprinter-options.schema.json
@@ -0,0 +1,181 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter/tree/main/jfiletreeprettyprinter-cli/src/main/resources/schemas/jfiletreeprettyprinter-options.schema.json",
+ "title": "JFileTreePrettyPrinter options",
+ "description": "Options file for JFileTreePrettyPrinter, JSON/YAML-based settings.",
+ "type": "object",
+ "properties": {
+
+ "emojis": {
+ "type": "boolean",
+ "description": "Whether to display emojis next to files and directories."
+ },
+
+ "compactDirectories": {
+ "type": "boolean",
+ "description": "Whether to compact directories with a single directory child into one line."
+ },
+
+ "maxDepth": {
+ "type": "integer",
+ "description": "Maximum depth of directories to print. Negative value means unlimited."
+ },
+
+ "childLimit": {
+ "oneOf": [
+ {
+ "properties": {
+ "type": { "const": "static" },
+ "limit": {
+ "type": "integer",
+ "description": "Global limit rule to apply to all paths. Negative value means unlimited."
+ }
+ },
+ "required": ["type", "limit"],
+ "additionalProperties": false
+ },
+ {
+ "properties": {
+ "type": { "const": "dynamic" },
+ "limits": {
+ "type": "array",
+ "description": "Dynamic list of limit rules based on path matchers. Negative value means unlimited.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "limit": {
+ "type": "integer",
+ "minimum": -1,
+ "description": "Number of allowed children. Negative value means unlimited."
+ },
+ "matcher": { "$ref": "#/$defs/matcher" }
+ },
+ "required": ["limit", "matcher"],
+ "additionalProperties": false
+ }
+ }
+ },
+ "required": ["type", "limits"],
+ "additionalProperties": false
+ }
+ ]
+ },
+
+ "filter": {
+ "type": "object",
+ "description": "Optional filters for including or excluding paths.",
+ "properties": {
+ "dir": { "$ref": "#/$defs/matcher" },
+ "file": { "$ref": "#/$defs/matcher" }
+ },
+ "additionalProperties": false
+ },
+
+ "lineExtensions": {
+ "type": "array",
+ "description": "Custom text or comments appended to matching file lines.",
+ "items": {
+ "type": "object",
+ "properties": {
+ "extension": {
+ "type": "string",
+ "description": "The string appended after the path (e.g., file comment)."
+ },
+ "matcher": { "$ref": "#/$defs/matcher" }
+ },
+ "required": ["extension", "matcher"],
+ "additionalProperties": false
+ }
+ }
+ },
+ "additionalProperties": false,
+
+ "$defs": {
+
+ "matcher": {
+ "type": "object",
+ "description": "Defines a path matching rule.",
+ "oneOf": [
+ {
+ "description": "Matches everything.",
+ "properties": {
+ "type": { "const": "everything" },
+ },
+ "required": ["type"],
+ "additionalProperties": false
+ },
+ {
+ "description": "Matches nothing.",
+ "properties": {
+ "type": { "const": "nothing" },
+ },
+ "required": ["type"],
+ "additionalProperties": false
+ },
+ {
+ "description": "Matches all of nested matchers.",
+ "properties": {
+ "type": { "const": "allOf" },
+ "matchers": {
+ "type": "array",
+ "description": "Nested matchers.",
+ "items": { "$ref": "#/$defs/matcher" }
+ }
+ },
+ "required": ["type", "matchers"],
+ "additionalProperties": false
+ },
+ {
+ "description": "Matches any of nested matchers.",
+ "properties": {
+ "type": { "const": "anyOf" },
+ "matchers": {
+ "type": "array",
+ "description": "Nested matchers.",
+ "items": { "$ref": "#/$defs/matcher" }
+ }
+ },
+ "required": ["type", "matchers"],
+ "additionalProperties": false
+ },
+ {
+ "description": "Matches none of nested matchers.",
+ "properties": {
+ "type": { "const": "noneOf" },
+ "matchers": {
+ "type": "array",
+ "description": "Nested matchers.",
+ "items": { "$ref": "#/$defs/matcher" }
+ }
+ },
+ "required": ["type", "matchers"],
+ "additionalProperties": false
+ },
+ {
+ "description": "File or directory name glob matcher",
+ "properties": {
+ "type": { "const": "name" },
+ "glob": {
+ "type": "string",
+ "description": "Glob pattern to match file or directory name."
+ },
+ },
+ "required": ["type", "glob"],
+ "additionalProperties": false
+ },
+ {
+ "description": "File or directory path glob matcher, relative to pretty printed root dir",
+ "properties": {
+ "type": { "const": "path" },
+ "glob": {
+ "type": "string",
+ "description": "Glob pattern to match file or directory path."
+ },
+ },
+ "required": ["type", "glob"],
+ "additionalProperties": false
+ }
+ ]
+ }
+ }
+}
diff --git a/jfiletreeprettyprinter-cli/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/FileTreePrettyPrinterCommandLineTest.java b/jfiletreeprettyprinter-cli/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/FileTreePrettyPrinterCommandLineTest.java
new file mode 100644
index 0000000..79c7269
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/FileTreePrettyPrinterCommandLineTest.java
@@ -0,0 +1,356 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.exception.DefaultExecutionExceptionHandler;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io.ConsoleOutput;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.io.DefaultConsoleOutput;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.OptionsLoader;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.ChildLimits;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PrettyPrintOptions;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.nio.file.Path;
+import java.util.function.Consumer;
+import org.jspecify.annotations.Nullable;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+class FileTreePrettyPrinterCommandLineTest {
+
+ private ByteArrayOutputStream outAndErrStream;
+
+ private ConsoleOutput output;
+
+ @BeforeEach
+ void prepareSystemOut() {
+ outAndErrStream = new ByteArrayOutputStream();
+
+ output = new DefaultConsoleOutput(new PrintStream(outAndErrStream), new PrintStream(outAndErrStream));
+ }
+
+ private String[] buildCliArgs(String targetPath, @Nullable String optionsPath) {
+ if (optionsPath == null) {
+ return new String[] { targetPath };
+ }
+ return new String[] { targetPath, "-o", optionsPath };
+// return new String[] { targetPath, "-o", optionsPath, "-d" };
+ }
+
+ private void runSuccessTest(FileTreePrettyPrinterCommandLine cli, String[] args, FileTreePrettyPrinter ref, String targetPath) {
+ cli.executeCommand(args);
+ var allWrittenLines = new String(outAndErrStream.toByteArray());
+ assertThat(allWrittenLines).isEqualToNormalizingNewlines(ref.prettyPrint(targetPath) + System.lineSeparator());
+ }
+
+ private void runErrorTest(FileTreePrettyPrinterCommandLine cli, String[] args, Consumer outputAssertor) {
+ cli.executeCommand(args);
+ var allWrittenLines = new String(outAndErrStream.toByteArray());
+ outputAssertor.accept(allWrittenLines);
+ }
+
+ @Test
+ void no_options() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = null;
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var ref = FileTreePrettyPrinter.createDefault();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ @Test
+ void unexisting_options() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "not_existing";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ Consumer outputAssertor = out -> assertThat(out).startsWith("[ERROR] Options file does not exist:").contains("not_existing");
+ runErrorTest(cli, args, outputAssertor);
+ }
+
+ @Test
+ void malformed_options() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/malformed.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ Consumer outputAssertor = out -> assertThat(out).startsWith("[ERROR] IO error or malformed options file:").contains("malformed.yaml");
+ runErrorTest(cli, args, outputAssertor);
+ }
+
+ @Test
+ void invalid_options() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/invalid.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ Consumer outputAssertor = out -> assertThat(out)
+ .startsWith("[ERROR] Invalid options file:")
+ .contains("childLimit.limits[0].matcher.glob:")
+ .contains("childLimit.limits[1].matcher.glob:");
+ runErrorTest(cli, args, outputAssertor);
+ }
+
+ @Nested
+ class Emojis {
+
+ @Test
+ void nominal() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/emojis.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(PrettyPrintOptions::withDefaultEmojis)
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ }
+
+ @Nested
+ class CompactDirectories {
+
+ @Test
+ void nominal() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/compactDirectories.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withCompactDirectories(true))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ }
+
+ @Nested
+ class MaxDepth {
+
+ @Test
+ void nominal() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/maxDepth.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withMaxDepth(2))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ }
+
+ @Nested
+ class ChildLimit {
+
+ @Test
+ void static_limit() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/childLimit_static.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withChildLimit(2))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ @Test
+ void dynamic_limit_glob() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/childLimit_dynamic_glob.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var childLimit = ChildLimits.builder()
+ .add(PathMatchers.hasNameMatchingGlob("*_a"), 2)
+ .add(PathMatchers.hasRelativePathMatchingGlob(Path.of(targetPath), "/*_b"), 3)
+ .build();
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withChildLimit(childLimit))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ @Test
+ void dynamic_limit_everything() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/childLimit_dynamic_everything.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var childLimit = ChildLimits.builder()
+ .add(p -> 2)
+ .build();
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withChildLimit(childLimit))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ @Test
+ void dynamic_limit_allOf() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/childLimit_dynamic_allOf.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var childLimit = ChildLimits.builder()
+ .add(PathMatchers.allOf(PathMatchers.hasNameMatchingGlob("*3"), PathMatchers.hasNameMatchingGlob("*xxx*")), 2)
+ .add(PathMatchers.allOf(PathMatchers.hasNameMatchingGlob("*3"), PathMatchers.hasNameMatchingGlob("*z*")), 3)
+ .build();
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withChildLimit(childLimit))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ @Test
+ void dynamic_limit_anyOf() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/childLimit_dynamic_anyOf.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var childLimit = ChildLimits.builder()
+ .add(PathMatchers.anyOf(PathMatchers.hasNameMatchingGlob("*3"), PathMatchers.hasNameMatchingGlob("*xxx*")), 2)
+ .add(PathMatchers.anyOf(PathMatchers.hasNameMatchingGlob("*3"), PathMatchers.hasNameMatchingGlob("*z*")), 3)
+ .build();
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withChildLimit(childLimit))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ @Test
+ void dynamic_limit_noneOf() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/childLimit_dynamic_noneOf.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var childLimit = ChildLimits.builder()
+ .add(PathMatchers.noneOf(PathMatchers.hasNameMatchingGlob("*a"), PathMatchers.hasNameMatchingGlob("folder*")), 2)
+ .add(PathMatchers.noneOf(PathMatchers.hasNameMatchingGlob("*a"), PathMatchers.hasNameMatchingGlob("*xxx*")), 3)
+ .build();
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withChildLimit(childLimit))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ }
+
+ @Nested
+ class Filter {
+
+ @Test
+ void nominal() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/filter.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.filterDirectories(PathMatchers.hasNameMatchingGlob("*a")))
+ .customizeOptions(options -> options.filterFiles(PathMatchers.hasNameMatchingGlob("*.java")))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ }
+
+ @Nested
+ class LineExtensions {
+
+ @Test
+ void nominal() {
+ String targetPath = "src/test/resources/cli/base";
+ String optionsPath = "src/test/resources/cli/options/lineExtensions.yaml";
+ String[] args = buildCliArgs(targetPath, optionsPath);
+
+ var optionsLoader = OptionsLoader.createDefault(output);
+ var exHandler = new DefaultExecutionExceptionHandler(output);
+ var cli = new FileTreePrettyPrinterCommandLine(output, optionsLoader, exHandler);
+
+ var extensions = io.github.computerdaddyguy.jfiletreeprettyprinter.options.LineExtensions.builder()
+ .add(PathMatchers.hasNameMatchingGlob("*.java"), " // This is java file")
+ .add(PathMatchers.hasNameMatchingGlob("*.php"), " // This is php file")
+ .build();
+ var ref = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withLineExtension(extensions))
+ .build();
+
+ runSuccessTest(cli, args, ref, targetPath);
+ }
+
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/ManifestVersionProviderTest.java b/jfiletreeprettyprinter-cli/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/ManifestVersionProviderTest.java
new file mode 100644
index 0000000..8b79f20
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/ManifestVersionProviderTest.java
@@ -0,0 +1,31 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class ManifestVersionProviderTest {
+
+ @Test
+ void nominal() throws Exception {
+ var provider = new ManifestVersionProvider();
+
+ var actual = provider.getVersion();
+
+ /*
+ * JFileTreePrettyPrinter 0.1.1-SNAPSHOT
+ * A lightweight and flexible Java library with a native CLI to pretty-print directory structures - ideal for documentation, project overviews, or CLI tools.
+ * Repository: https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter
+ * Commit: 23cf1139157ffa046378fb602fe7750a107c6bc1 (2025-11-04T22:27:16+01:00)
+ * Built on: 2025-11-06T22:07:30+01:00
+ */
+ assertThat(actual).satisfiesExactly(
+ line1 -> assertThat(line1).isNotBlank(),
+ line2 -> assertThat(line2).isNotBlank(),
+ line3 -> assertThat(line3).startsWith("Repository:"),
+ line4 -> assertThat(line4).startsWith("Commit:"),
+ line5 -> assertThat(line5).startsWith("Built on:")
+ );
+ }
+
+}
diff --git a/jfiletreeprettyprinter-cli/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/RecordUtilsTest.java b/jfiletreeprettyprinter-cli/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/RecordUtilsTest.java
new file mode 100644
index 0000000..6c377cd
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/cli/RecordUtilsTest.java
@@ -0,0 +1,68 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.cli;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ChildLimit.DynamicLimit;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ChildLimit.DynamicLimitItem;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.ExternalOptions;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Filter;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.LineExtension;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher.NameGlob;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.cli.options.model.Matcher.PathGlob;
+import java.util.List;
+import org.junit.jupiter.api.Test;
+
+class RecordUtilsTest {
+
+ @Test
+ void nominal() {
+
+ var dynLimit1 = new DynamicLimitItem(1, new NameGlob("*.java"));
+ var dynLimit2 = new DynamicLimitItem(1, new PathGlob("pictures"));
+ var childLimit = new DynamicLimit(List.of(dynLimit1, dynLimit2));
+ var maxDepth = 3;
+ var filter = new Filter(
+ new NameGlob("folderOk"),
+ new NameGlob("fileOk.*")
+ );
+ var lineExt1 = new LineExtension("This is java file", new NameGlob("*.java"));
+ var lineExt2 = new LineExtension("This is php file", new NameGlob("*.php"));
+ var lineExtensions = List.of(lineExt1, lineExt2);
+ var rec = new ExternalOptions(Boolean.TRUE, Boolean.TRUE, maxDepth, childLimit, filter, lineExtensions);
+
+ var expected = """
+ ExternalOptions
+ emojis: true
+ compactDirectories: true
+ maxDepth: 3
+ childLimit -> DynamicLimit
+ limits: [
+ [0] -> DynamicLimitItem
+ limit: 1
+ matcher -> NameGlob
+ glob: "*.java"
+ [1] -> DynamicLimitItem
+ limit: 1
+ matcher -> PathGlob
+ glob: "pictures"
+ ]
+ filter -> Filter
+ dir -> NameGlob
+ glob: "folderOk"
+ file -> NameGlob
+ glob: "fileOk.*"
+ lineExtensions: [
+ [0] -> LineExtension
+ extension: "This is java file"
+ matcher -> NameGlob
+ glob: "*.java"
+ [1] -> LineExtension
+ extension: "This is php file"
+ matcher -> NameGlob
+ glob: "*.php"
+ ]""";
+
+ assertThat(RecordUtils.toTextBlock(rec)).isEqualToNormalizingNewlines(expected);
+ }
+
+}
diff --git a/src/example/resources/base/businessPlan.pdf b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_a/file_1.txt
similarity index 100%
rename from src/example/resources/base/businessPlan.pdf
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_a/file_1.txt
diff --git a/src/example/resources/base/businessProject.pdf b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_a/file_2.java
similarity index 100%
rename from src/example/resources/base/businessProject.pdf
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_a/file_2.java
diff --git a/src/example/resources/base/cars/Ferrari.doc b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_a/file_3.php
similarity index 100%
rename from src/example/resources/base/cars/Ferrari.doc
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_a/file_3.php
diff --git a/src/example/resources/base/cars/Porsche.doc b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_a/file_4.jpeg
similarity index 100%
rename from src/example/resources/base/cars/Porsche.doc
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_a/file_4.jpeg
diff --git a/src/example/resources/base/diyIdeas.docx b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_b/file_1.txt
similarity index 100%
rename from src/example/resources/base/diyIdeas.docx
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_b/file_1.txt
diff --git a/src/example/resources/base/giftIdeas.txt b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_b/file_2.java
similarity index 100%
rename from src/example/resources/base/giftIdeas.txt
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_b/file_2.java
diff --git a/src/example/resources/base/images/funnyCat.gif b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_b/file_3.php
similarity index 100%
rename from src/example/resources/base/images/funnyCat.gif
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_b/file_3.php
diff --git a/src/example/resources/base/images/holidays/meAtTheBeach.jpeg b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_b/file_4.jpeg
similarity index 100%
rename from src/example/resources/base/images/holidays/meAtTheBeach.jpeg
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_b/file_4.jpeg
diff --git a/src/example/resources/base/images/holidays/meAtTheZoo.jpeg b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_c/file_1.txt
similarity index 100%
rename from src/example/resources/base/images/holidays/meAtTheZoo.jpeg
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_c/file_1.txt
diff --git a/src/example/resources/base/images/landscape.jpeg b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_c/file_2.java
similarity index 100%
rename from src/example/resources/base/images/landscape.jpeg
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_c/file_2.java
diff --git a/src/example/resources/child_limit_dynamic/file_0_1 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_c/file_3.php
similarity index 100%
rename from src/example/resources/child_limit_dynamic/file_0_1
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_c/file_3.php
diff --git a/src/example/resources/child_limit_dynamic/folder_1/file_1_1 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_c/file_4.jpeg
similarity index 100%
rename from src/example/resources/child_limit_dynamic/folder_1/file_1_1
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_c/file_4.jpeg
diff --git a/src/example/resources/child_limit_dynamic/folder_1/file_1_2 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_d/file_1.txt
similarity index 100%
rename from src/example/resources/child_limit_dynamic/folder_1/file_1_2
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_d/file_1.txt
diff --git a/src/example/resources/child_limit_dynamic/folder_1/file_1_3 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_d/file_2.java
similarity index 100%
rename from src/example/resources/child_limit_dynamic/folder_1/file_1_3
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_d/file_2.java
diff --git a/src/example/resources/child_limit_dynamic/folder_1/file_1_4 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_d/file_3.php
similarity index 100%
rename from src/example/resources/child_limit_dynamic/folder_1/file_1_4
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_d/file_3.php
diff --git a/src/example/resources/child_limit_dynamic/folder_1/file_1_5 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_d/file_4.jpeg
similarity index 100%
rename from src/example/resources/child_limit_dynamic/folder_1/file_1_5
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_d/file_4.jpeg
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_01 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_z1/folder_z2/folder_z3/file_1.txt
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_01
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_z1/folder_z2/folder_z3/file_1.txt
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_02 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_z1/folder_z2/folder_z3/file_2.java
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_02
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_z1/folder_z2/folder_z3/file_2.java
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_03 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_z1/folder_z2/folder_z3/file_3.php
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_03
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_z1/folder_z2/folder_z3/file_3.php
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_04 b/jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_z1/folder_z2/folder_z3/file_4.jpeg
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_04
rename to jfiletreeprettyprinter-cli/src/test/resources/cli/base/folder_z1/folder_z2/folder_z3/file_4.jpeg
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_allOf.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_allOf.yaml
new file mode 100644
index 0000000..ebff60c
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_allOf.yaml
@@ -0,0 +1,19 @@
+childLimit:
+ type: dynamic
+ limits:
+ - limit: 2
+ matcher:
+ type: allOf
+ matchers:
+ - type: name
+ glob: "*3"
+ - type: name
+ glob: "*xxx*"
+ - limit: 3
+ matcher:
+ type: allOf
+ matchers:
+ - type: name
+ glob: "*3"
+ - type: name
+ glob: "*z*"
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_anyOf.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_anyOf.yaml
new file mode 100644
index 0000000..43ff526
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_anyOf.yaml
@@ -0,0 +1,19 @@
+childLimit:
+ type: dynamic
+ limits:
+ - limit: 2
+ matcher:
+ type: anyOf
+ matchers:
+ - type: name
+ glob: "*3"
+ - type: name
+ glob: "*xxx*"
+ - limit: 3
+ matcher:
+ type: anyOf
+ matchers:
+ - type: name
+ glob: "*3"
+ - type: name
+ glob: "*z*"
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_everything.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_everything.yaml
new file mode 100644
index 0000000..f3599c5
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_everything.yaml
@@ -0,0 +1,6 @@
+childLimit:
+ type: dynamic
+ limits:
+ - limit: 2
+ matcher:
+ type: everything
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_glob.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_glob.yaml
new file mode 100644
index 0000000..ff8886b
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_glob.yaml
@@ -0,0 +1,11 @@
+childLimit:
+ type: dynamic
+ limits:
+ - limit: 2
+ matcher:
+ type: name
+ glob: "*_a"
+ - limit: 3
+ matcher:
+ type: path
+ glob: "/*_b"
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_noneOf.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_noneOf.yaml
new file mode 100644
index 0000000..fac63bd
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_dynamic_noneOf.yaml
@@ -0,0 +1,19 @@
+childLimit:
+ type: dynamic
+ limits:
+ - limit: 2
+ matcher:
+ type: noneOf
+ matchers:
+ - type: name
+ glob: "*a"
+ - type: name
+ glob: "folder*"
+ - limit: 3
+ matcher:
+ type: noneOf
+ matchers:
+ - type: name
+ glob: "*a"
+ - type: name
+ glob: "*xxx*"
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_static.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_static.yaml
new file mode 100644
index 0000000..422a45c
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/childLimit_static.yaml
@@ -0,0 +1,3 @@
+childLimit:
+ type: static
+ limit: 2
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/compactDirectories.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/compactDirectories.yaml
new file mode 100644
index 0000000..250030c
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/compactDirectories.yaml
@@ -0,0 +1 @@
+compactDirectories: true
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/emojis.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/emojis.yaml
new file mode 100644
index 0000000..e94aee6
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/emojis.yaml
@@ -0,0 +1 @@
+emojis: true
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/filter.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/filter.yaml
new file mode 100644
index 0000000..a10541f
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/filter.yaml
@@ -0,0 +1,7 @@
+filter:
+ dir:
+ type: name
+ glob: "*a"
+ file:
+ type: name
+ glob: "*.java"
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/invalid.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/invalid.yaml
new file mode 100644
index 0000000..c5dc59b
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/invalid.yaml
@@ -0,0 +1,11 @@
+childLimit:
+ type: dynamic
+ limits:
+ - limit: 2
+ matcher:
+ type: "name"
+ glob: ""
+ - limit: 3
+ matcher:
+ type: "name"
+ glob: ""
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/lineExtensions.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/lineExtensions.yaml
new file mode 100644
index 0000000..c503e0f
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/lineExtensions.yaml
@@ -0,0 +1,9 @@
+lineExtensions:
+ - extension: " // This is java file"
+ matcher:
+ type: name
+ glob: "*.java"
+ - extension: " // This is php file"
+ matcher:
+ type: name
+ glob: "*.php"
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/malformed.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/malformed.yaml
new file mode 100644
index 0000000..1d9dfc5
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/malformed.yaml
@@ -0,0 +1 @@
+emojis true
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-cli/src/test/resources/cli/options/maxDepth.yaml b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/maxDepth.yaml
new file mode 100644
index 0000000..bcf7299
--- /dev/null
+++ b/jfiletreeprettyprinter-cli/src/test/resources/cli/options/maxDepth.yaml
@@ -0,0 +1 @@
+maxDepth: 2
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-core/pom.xml b/jfiletreeprettyprinter-core/pom.xml
new file mode 100644
index 0000000..95a94dd
--- /dev/null
+++ b/jfiletreeprettyprinter-core/pom.xml
@@ -0,0 +1,154 @@
+
+ 4.0.0
+
+ io.github.computerdaddyguy
+ jfiletreeprettyprinter
+ ${revision}
+
+
+ jfiletreeprettyprinter-core
+
+ jar
+
+ JFileTreePrettyPrinter
+ A lightweight and flexible Java library with a native CLI to pretty-print directory structures - ideal for documentation, project overviews, or CLI tools.
+ https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter
+
+
+ The Apache License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+
+
+
+
+ Samuel SCHNEGG
+ samuel.schnegg@gmail.com
+
+
+
+ scm:git:git://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter.git
+ scm:git:ssh://github.com:ComputerDaddyGuy/JFileTreePrettyPrinter.git
+ https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter
+
+
+
+
+ org.jspecify
+ jspecify
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ test
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+
+
+
+ release
+
+
+
+
+ org.codehaus.mojo
+ flatten-maven-plugin
+
+ ossrh
+ true
+
+
+
+ flatten
+ process-resources
+
+ flatten
+
+
+
+ flatten.clean
+ clean
+
+ clean
+
+
+
+
+
+ org.sonatype.central
+ central-publishing-maven-plugin
+ ${central-publishing-maven-plugin.version}
+ true
+
+ central
+ true
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ ${maven-source-plugin.version}
+
+
+ attach-sources
+ verify
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+
+ attach-javadoc
+
+ jar
+
+
+
+
+ java
+ none
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ ${maven-gpg-plugin.version}
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+
+
+
+ --pinentry-mode
+ loopback
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/DefaultFileTreePrettyPrinter.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/DefaultFileTreePrettyPrinter.java
similarity index 95%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/DefaultFileTreePrettyPrinter.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/DefaultFileTreePrettyPrinter.java
index ffaee8f..a82f7d3 100644
--- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/DefaultFileTreePrettyPrinter.java
+++ b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/DefaultFileTreePrettyPrinter.java
@@ -20,6 +20,7 @@ public DefaultFileTreePrettyPrinter(PathToTreeScanner scanner, TreeEntryRenderer
@Override
public String prettyPrint(Path path) {
Objects.requireNonNull(path, "path cannot be null");
+ path = path.toAbsolutePath().normalize();
var tree = scanner.scan(path);
return renderer.renderTree(tree);
}
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinter.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinter.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinter.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinter.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilder.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilder.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilder.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilder.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimitBuilder.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimitBuilder.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimitBuilder.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimitBuilder.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimits.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimits.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimits.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/ChildLimits.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMapping.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMapping.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMapping.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMapping.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMappingBuilder.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMappingBuilder.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMappingBuilder.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/DefaultEmojiMappingBuilder.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMapping.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMapping.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMapping.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMapping.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMappingBuilder.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMappingBuilder.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMappingBuilder.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/EmojiMappingBuilder.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensionBuilder.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensionBuilder.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensionBuilder.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensionBuilder.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensions.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensions.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensions.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/LineExtensions.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/MappingUtils.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/MappingUtils.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/MappingUtils.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/MappingUtils.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathExtensionEmojiFunction.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathExtensionEmojiFunction.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathExtensionEmojiFunction.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathExtensionEmojiFunction.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatcherEmojiFunction.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatcherEmojiFunction.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatcherEmojiFunction.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatcherEmojiFunction.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatchers.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatchers.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatchers.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathMatchers.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathNameEmojiFunction.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathNameEmojiFunction.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathNameEmojiFunction.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathNameEmojiFunction.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSortBuilder.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSortBuilder.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSortBuilder.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSortBuilder.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSorts.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSorts.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSorts.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PathSorts.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PrettyPrintOptions.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PrettyPrintOptions.java
similarity index 96%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PrettyPrintOptions.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PrettyPrintOptions.java
index 8a52df7..8cf06e3 100644
--- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PrettyPrintOptions.java
+++ b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/PrettyPrintOptions.java
@@ -8,6 +8,7 @@
import java.util.Objects;
import java.util.function.Function;
import java.util.function.ToIntFunction;
+import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
@@ -213,11 +214,11 @@ public PrettyPrintOptions filterFiles(@Nullable PathMatcher matcher) {
// ---------- Line extension ----------
@Nullable
- private Function lineExtension;
+ private Function<@NonNull Path, @Nullable String> lineExtension;
@Override
@Nullable
- public Function getLineExtension() {
+ public Function<@NonNull Path, @Nullable String> getLineExtension() {
return lineExtension;
}
@@ -237,7 +238,7 @@ public Function getLineExtension() {
* @see LineExtensions
* @see LineExtensionBuilder
*/
- public PrettyPrintOptions withLineExtension(@Nullable Function lineExtension) {
+ public PrettyPrintOptions withLineExtension(@Nullable Function<@NonNull Path, @Nullable String> lineExtension) {
this.lineExtension = lineExtension;
return this;
}
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/SequentialEmojiFunction.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/SequentialEmojiFunction.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/SequentialEmojiFunction.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/SequentialEmojiFunction.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormat.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormat.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormat.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormat.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormats.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormats.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormats.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/options/TreeFormats.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultFileFormatter.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultFileFormatter.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultFileFormatter.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultFileFormatter.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java
similarity index 86%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java
index f25d520..46f540e 100644
--- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java
+++ b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultLineRenderer.java
@@ -8,7 +8,6 @@
import java.util.List;
import java.util.Objects;
import org.jspecify.annotations.NullMarked;
-import org.jspecify.annotations.Nullable;
@NullMarked
class DefaultLineRenderer implements LineRenderer {
@@ -32,12 +31,12 @@ public String renderFile(Depth depth, FileEntry fileEntry) {
}
@Override
- public @Nullable String renderChildLimitReached(Depth depth, SkippedChildrenEntry skippedChildrenEntry) {
+ public String renderChildLimitReached(Depth depth, SkippedChildrenEntry skippedChildrenEntry) {
return treeFormatter.format(depth) + fileFormatter.formatChildLimitReached(skippedChildrenEntry);
}
@Override
- public @Nullable String renderMaxDepthReached(Depth depth, MaxDepthReachEntry maxDepthReachEntry) {
+ public String renderMaxDepthReached(Depth depth, MaxDepthReachEntry maxDepthReachEntry) {
return treeFormatter.format(depth) + fileFormatter.formatMaxDepthReached(maxDepthReachEntry);
}
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeEntryRenderer.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeEntryRenderer.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeEntryRenderer.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeEntryRenderer.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeFormatter.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeFormatter.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeFormatter.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DefaultTreeFormatter.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/Depth.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/Depth.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/Depth.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/Depth.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/EmojiFileFormatter.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/EmojiFileFormatter.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/EmojiFileFormatter.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/EmojiFileFormatter.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/FileFormatter.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/FileFormatter.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/FileFormatter.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/FileFormatter.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/LineRenderer.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/LineRenderer.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/LineRenderer.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/LineRenderer.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java
similarity index 88%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java
index bbe1cab..e4150df 100644
--- a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java
+++ b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/RenderingOptions.java
@@ -4,6 +4,7 @@
import io.github.computerdaddyguy.jfiletreeprettyprinter.options.TreeFormat;
import java.nio.file.Path;
import java.util.function.Function;
+import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
@@ -33,6 +34,6 @@ public interface RenderingOptions {
* @return
*/
@Nullable
- Function getLineExtension();
+ Function<@NonNull Path, @Nullable String> getLineExtension();
}
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeEntryRenderer.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeEntryRenderer.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeEntryRenderer.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeEntryRenderer.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeFormatter.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeFormatter.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeFormatter.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeFormatter.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeSymbol.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeSymbol.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeSymbol.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/TreeSymbol.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/DefaultPathToTreeScanner.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/DefaultPathToTreeScanner.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/DefaultPathToTreeScanner.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/DefaultPathToTreeScanner.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/PathToTreeScanner.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/PathToTreeScanner.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/PathToTreeScanner.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/PathToTreeScanner.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/ScanningOptions.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/ScanningOptions.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/ScanningOptions.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/ScanningOptions.java
diff --git a/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/TreeEntry.java b/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/TreeEntry.java
similarity index 100%
rename from src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/TreeEntry.java
rename to jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner/TreeEntry.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/BasicUsageTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/BasicUsageTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/BasicUsageTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/BasicUsageTest.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitDynamicTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitDynamicTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitDynamicTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitDynamicTest.java
diff --git a/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitStaticTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitStaticTest.java
new file mode 100644
index 0000000..a05ffc0
--- /dev/null
+++ b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitStaticTest.java
@@ -0,0 +1,75 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructures;
+import java.nio.file.Path;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+class ChildLimitStaticTest {
+
+ @TempDir
+ private Path root;
+
+ @Test
+ void empty_directory() {
+ var path = FileStructures.emptyDirectory(root);
+ var printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withChildLimit(3))
+ .build();
+ var result = printer.prettyPrint(path);
+ var expected = "targetPath/";
+ assertThat(result).isEqualTo(expected);
+ }
+
+ private void doTest(int limit, String expected) {
+ var path = FileStructures.simpleDirectoryWithFiles(root, 3);
+
+ var printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withChildLimit(limit))
+ .build();
+
+ var result = printer.prettyPrint(path);
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @Test
+ void test_0_file() {
+ var expected = """
+ targetPath/
+ └─ ...""";
+ doTest(0, expected);
+ }
+
+ @Test
+ void test_1_file() {
+ var expected = """
+ targetPath/
+ ├─ file1
+ └─ ...""";
+ doTest(1, expected);
+ }
+
+ @Test
+ void test_limit_minus_one_files() {
+ var expected = """
+ targetPath/
+ ├─ file1
+ ├─ file2
+ └─ ...""";
+ doTest(2, expected);
+ }
+
+ @Test
+ void test_exact_limit_of_files() {
+ var expected = """
+ targetPath/
+ ├─ file1
+ ├─ file2
+ └─ file3""";
+ doTest(3, expected);
+ }
+
+}
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/CompactDirectoriesTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/CompactDirectoriesTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/CompactDirectoriesTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/CompactDirectoriesTest.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java
similarity index 57%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java
index 56d6082..1919f2a 100644
--- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java
+++ b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/EmojisTest.java
@@ -11,6 +11,8 @@
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
class EmojisTest {
@@ -30,137 +32,176 @@ void emptyDir() {
assertThat(result).isEqualTo(expected);
}
- @Test
- void emojis() {
+ @ParameterizedTest
+ @CsvSource(delimiter = ' ', textBlock = """
+
+ 📄 file.unknown_extension
+ 📄 file_without_extension
+
+ # ------------------------------
+ # Application
+
+ # Executables
+ 📱 file.apk
+ 🖥️ file.app
+ ⚙️ file.bin
+ ⚙️ file.exe
+ 📦 file.msi
+ 📱 file.ipa
+
+ # Libs
+ 🧩 file.dll
+ 🧩 file.lib
+ 🧩 file.so
+
+ # ------------------------------
+ # Archives
+
+ 📦 file.7z
+ 📦 file.gz
+ 💿 file.img
+ 💿 file.iso
+ 📦 file.rar
+ 📦 file.tar
+ 📦 file.zip
+
+ # ------------------------------
+ # Code
+
+ 🚫 .gitignore
+ 🐳 Dockerfile
+ 🤵 Jenkinsfile
+ ⚙️ docker-compose.yml
+
+ # Build tools
+ 🛠️ build.gradle
+ 🛠️ makefile
+ 🛠️ package.json
+ 🛠️ pom.xml
+
+ # Lang
+ 💠 file.c
+ ☕ file.class
+ 💠 file.cpp
+ 💠 file.cs
+ 🎨 file.css
+ 🌐 file.htm
+ 🌐 file.html
+ 🌐 file.htmx
+ 📦 file.jar
+ ☕ file.java
+ 🎨 file.less
+ 🐘 file.php
+ 🐍 file.py
+ 🎨 file.scss
+ 🗄️ file.sql
+ 🔷 file.ts
+
+ # Scripting
+ 📜 file.bash
+ 📜 file.bat
+ 📜 file.sh
+
+ # ------------------------------
+ # Data
+
+ ⚙️ file.cfg
+ ⚙️ file.conf
+ 📊 file.csv
+ ⚙️ file.ini
+ 📝 file.json
+ 📊 file.ods
+ ⚙️ file.properties
+ 📊 file.xls
+ 📊 file.xlsx
+ 📝 file.xml
+ 📝 file.yaml
+ 📝 file.yml
+
+ # ------------------------------
+ # Doc
+
+ 📝 file.doc
+ 📝 file.docx
+ 📚 file.epub
+ 📝 file.md
+ 📝 file.odt
+ 📕 file.pdf
+ 📝 file.rtf
+ 📝 file.txt
+
+ # ------------------------------
+ # Internet
+
+ 🤖 robots.txt
+
+ # Github
+ 🆕 changelog
+ 🆕 changelog.md
+ 🤝 contributing
+ 🤝 contributing.md
+ ⚖️ license
+ ⚖️ license.md
+ 📘 readme
+ 📘 readme.md
+ 🗺️ roadmap
+ 🗺️ roadmap.md
+ 🛡️ security
+ 🛡️ security.md
+
+ # ------------------------------
+ # Media
+
+ # Audio
+ 🎵 file.aac
+ 🎵 file.flac
+ 🎹 file.midi
+ 🎵 file.mp3
+ 🎵 file.ogg
+ 🎵 file.wav
+
+ # Images
+ 🖼️ file.bmp
+ 🎞️ file.gif
+ 🖼️ file.ico
+ 🖼️ file.jpeg
+ 🖼️ file.jpg
+ 🖼️ file.png
+ ✒️ file.svg
+
+ # Video
+ 🎬 file.avi
+ 🎬 file.mkv
+ 🎬 file.mov
+ 🎬 file.mp4
+ 🎬 file.webm
+ 🎬 file.wmv
+
+ # ------------------------------
+ # System
+
+ 💾 file.bak
+ 🔐 file.crt
+ 🔑 file.key
+ 📜 file.log
+ 🔐 file.pem
+ 🔓 file.pub
+ 🗑️ file.tmp
+
+ """)
+ void emojis(String expectedEmoji, String fileName) {
var printer = FileTreePrettyPrinter.builder()
.customizeOptions(PrettyPrintOptions::withDefaultEmojis)
.build();
- var result = printer.prettyPrint("src/example/resources/emojis");
- var expected = """
- 📂 emojis/
- ├─ 📂 applications/
- │ ├─ 📂 executables/
- │ │ ├─ 📱 file.apk
- │ │ ├─ 🖥️ file.app
- │ │ ├─ ⚙️ file.bin
- │ │ ├─ ⚙️ file.exe
- │ │ ├─ 📦 file.msi
- │ │ └─ 📱 file2.ipa
- │ └─ 📂 libs/
- │ ├─ 🧩 file.dll
- │ ├─ 🧩 file.lib
- │ └─ 🧩 file.so
- ├─ 📂 archives/
- │ ├─ 📦 file.7z
- │ ├─ 📦 file.gz
- │ ├─ 💿 file.img
- │ ├─ 💿 file.iso
- │ ├─ 📦 file.rar
- │ ├─ 📦 file.tar
- │ └─ 📦 file.zip
- ├─ 📂 code/
- │ ├─ 🚫 .gitignore
- │ ├─ 🐳 Dockerfile
- │ ├─ 🤵 Jenkinsfile
- │ ├─ 📂 build_tools/
- │ │ ├─ 🛠️ build.gradle
- │ │ ├─ 🛠️ makefile
- │ │ ├─ 🛠️ package.json
- │ │ └─ 🛠️ pom.xml
- │ ├─ ⚙️ docker-compose.yml
- │ ├─ 📂 lang/
- │ │ ├─ 💠 file.c
- │ │ ├─ ☕ file.class
- │ │ ├─ 💠 file.cpp
- │ │ ├─ 💠 file.cs
- │ │ ├─ 🎨 file.css
- │ │ ├─ 🌐 file.htm
- │ │ ├─ 🌐 file.html
- │ │ ├─ 🌐 file.htmx
- │ │ ├─ 📦 file.jar
- │ │ ├─ ☕ file.java
- │ │ ├─ 🎨 file.less
- │ │ ├─ 🐘 file.php
- │ │ ├─ 🐍 file.py
- │ │ ├─ 🎨 file.scss
- │ │ ├─ 🗄️ file.sql
- │ │ └─ 🔷 file.ts
- │ └─ 📂 scripting/
- │ ├─ 📜 file.bash
- │ ├─ 📜 file.bat
- │ └─ 📜 file.sh
- ├─ 📂 data/
- │ ├─ ⚙️ file.cfg
- │ ├─ ⚙️ file.conf
- │ ├─ 📊 file.csv
- │ ├─ ⚙️ file.ini
- │ ├─ 📝 file.json
- │ ├─ 📊 file.ods
- │ ├─ ⚙️ file.properties
- │ ├─ 📊 file.xls
- │ ├─ 📊 file.xlsx
- │ ├─ 📝 file.xml
- │ ├─ 📝 file.yaml
- │ └─ 📝 file.yml
- ├─ 📂 doc/
- │ ├─ 📝 file.doc
- │ ├─ 📝 file.docx
- │ ├─ 📚 file.epub
- │ ├─ 📝 file.md
- │ ├─ 📝 file.odt
- │ ├─ 📕 file.pdf
- │ ├─ 📝 file.rtf
- │ └─ 📝 file.txt
- ├─ 📄 file.unknown_extension
- ├─ 📄 file_without_extension
- ├─ 📂 internet/
- │ ├─ 📂 github/
- │ │ ├─ 🆕 changelog
- │ │ ├─ 🆕 changelog.md
- │ │ ├─ 🤝 contributing
- │ │ ├─ 🤝 contributing.md
- │ │ ├─ ⚖️ license
- │ │ ├─ ⚖️ license.md
- │ │ ├─ 📘 readme
- │ │ ├─ 📘 readme.md
- │ │ ├─ 🗺️ roadmap
- │ │ ├─ 🗺️ roadmap.md
- │ │ ├─ 🛡️ security
- │ │ └─ 🛡️ security.md
- │ └─ 🤖 robots.txt
- ├─ 📂 media/
- │ ├─ 📂 audio/
- │ │ ├─ 🎵 file.aac
- │ │ ├─ 🎵 file.flac
- │ │ ├─ 🎹 file.midi
- │ │ ├─ 🎵 file.mp3
- │ │ ├─ 🎵 file.ogg
- │ │ └─ 🎵 file.wav
- │ ├─ 📂 images/
- │ │ ├─ 🖼️ file.bmp
- │ │ ├─ 🎞️ file.gif
- │ │ ├─ 🖼️ file.ico
- │ │ ├─ 🖼️ file.jpeg
- │ │ ├─ 🖼️ file.jpg
- │ │ ├─ 🖼️ file.png
- │ │ └─ ✒️ file.svg
- │ └─ 📂 video/
- │ ├─ 🎬 file.avi
- │ ├─ 🎬 file.mkv
- │ ├─ 🎬 file.mov
- │ ├─ 🎬 file.mp4
- │ ├─ 🎬 file.webm
- │ └─ 🎬 file.wmv
- └─ 📂 system/
- ├─ 💾 file.bak
- ├─ 🔐 file.crt
- ├─ 🔑 file.key
- ├─ 📜 file.log
- ├─ 🔐 file.pem
- ├─ 🔓 file.pub
- └─ 🗑️ file.tmp""";
+ var path = FileStructureCreator.forTargetPath(root)
+ .createFile(fileName)
+ .getPath();
+
+ var result = printer.prettyPrint(path);
+
+ var expected = "📂 targetPath/\n└─ " + expectedEmoji + " " + fileName;
assertThat(result).isEqualTo(expected);
}
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilderTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilderTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilderTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterBuilderTest.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FileTreePrettyPrinterTest.java
diff --git a/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java
new file mode 100644
index 0000000..355a8b5
--- /dev/null
+++ b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java
@@ -0,0 +1,360 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathSorts;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructureCreator;
+import java.nio.file.Path;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+class FilteringTest {
+
+ @TempDir
+ private Path root;
+
+ @Test
+ void some_file_match() {
+ var path = FileStructureCreator.forTargetPath(root)
+ .createFile("file1.java")
+ .createFile("file2.php")
+ .createFile("file3.java")
+ .createFile("file4.c")
+ .createFile("file5.java")
+ .getPath();
+
+ var fileFilter = PathMatchers.hasExtension("java");
+
+ var printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.filterFiles(fileFilter))
+ .build();
+
+ var result = printer.prettyPrint(path);
+
+ var expected = """
+ targetPath/
+ ├─ file1.java
+ ├─ file3.java
+ └─ file5.java""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @Test
+ void no_file_match() {
+ var path = FileStructureCreator.forTargetPath(root)
+ .createFile("file1.java")
+ .createFile("file2.php")
+ .createFile("file3.java")
+ .createFile("file4.c")
+ .createFile("file5.java")
+ .getPath();
+
+ var fileFilter = PathMatchers.hasExtension("exe");
+
+ var printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.filterFiles(fileFilter))
+ .build();
+
+ var result = printer.prettyPrint(path);
+
+ var expected = """
+ targetPath/""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @Test
+ void some_directory_match() {
+ var path = FileStructureCreator.forTargetPath(root)
+ .createDirectory("dir1_A")
+ .createDirectory("dir2_B")
+ .createDirectory("dir3_A")
+ .createDirectory("dir4_C")
+ .createDirectory("dir5_A")
+ .getPath();
+
+ var dirFilter = PathMatchers.hasNameEndingWith("_A");
+
+ var printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.filterDirectories(dirFilter))
+ .build();
+
+ var result = printer.prettyPrint(path);
+
+ var expected = """
+ targetPath/
+ ├─ dir1_A/
+ ├─ dir3_A/
+ └─ dir5_A/""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @Test
+ void no_directory_match() {
+ var path = FileStructureCreator.forTargetPath(root)
+ .createDirectory("dir1_A")
+ .createDirectory("dir2_B")
+ .createDirectory("dir3_A")
+ .createDirectory("dir4_C")
+ .createDirectory("dir5_A")
+ .getPath();
+
+ var dirFilter = PathMatchers.hasNameEndingWith("_Z");
+
+ var printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.filterDirectories(dirFilter))
+ .build();
+
+ var result = printer.prettyPrint(path);
+
+ var expected = """
+ targetPath/""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @Test
+ void matchingFiles_inside_nonMathDir_are_not_displayed() {
+ // @formatter:off
+ var path = FileStructureCreator.forTargetPath(root)
+ .createAndEnterDirectory("dir_A")
+ .createFile("file_A1.java")
+ .up()
+ .createAndEnterDirectory("dir_B")
+ .createFile("file_B1.java")
+ .up()
+ .getPath();
+ // @formatter:on
+
+ var dirFilter = PathMatchers.hasNameEndingWith("_A");
+ var fileFilter = PathMatchers.hasExtension("java");
+
+ var printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.filterDirectories(dirFilter))
+ .customizeOptions(options -> options.filterFiles(fileFilter))
+ .build();
+
+ var result = printer.prettyPrint(path);
+
+ var expected = """
+ targetPath/
+ └─ dir_A/
+ └─ file_A1.java""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @Test
+ void matchingDirectories_inside_nonMathDir_are_not_displayed() {
+ // @formatter:off
+ var path = FileStructureCreator.forTargetPath(root)
+ .createAndEnterDirectory("dir_A")
+ .createDirectory("dir_A_sub")
+ .up()
+ .createAndEnterDirectory("dir_B")
+ .createDirectory("dir_B_sub")
+ .up()
+ .getPath();
+ // @formatter:on
+
+ var dirFilter = PathMatchers.anyOf(
+ PathMatchers.hasNameEndingWith("_A"),
+ PathMatchers.hasNameEndingWith("_sub")
+ );
+
+ var printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.filterDirectories(dirFilter))
+ .build();
+
+ var result = printer.prettyPrint(path);
+
+ var expected = """
+ targetPath/
+ └─ dir_A/
+ └─ dir_A_sub/""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @Nested
+ class WithSorting {
+
+ @Test
+ void combine_filtering_and_sorting() {
+ // @formatter:off
+ var path = FileStructureCreator.forTargetPath(root)
+ .createAndEnterDirectory("dir_A")
+ .createFile("file_A3.java")
+ .createFile("file_A2.java")
+ .createFile("file_Z4.java")
+ .createFile("file_A1.java")
+ .up()
+ .createAndEnterDirectory("dir_B")
+ .createFile("file_B1.java")
+ .up()
+ .getPath();
+ // @formatter:on
+
+ var fileFilter = PathMatchers.hasExtension("java");
+
+ FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.sort(PathSorts.ALPHABETICAL.reversed()))
+ .customizeOptions(options -> options.filterFiles(fileFilter))
+ .build();
+
+ var result = printer.prettyPrint(path);
+ var expected = """
+ targetPath/
+ ├─ dir_B/
+ │ └─ file_B1.java
+ └─ dir_A/
+ ├─ file_Z4.java
+ ├─ file_A3.java
+ ├─ file_A2.java
+ └─ file_A1.java""";
+ assertThat(result).isEqualTo(expected);
+ }
+
+ }
+
+ @Nested
+ class WithChildLimit {
+
+ private void combine_filtering_and_childLimit(int limit, String expected) {
+ // @formatter:off
+ var path = FileStructureCreator.forTargetPath(root)
+ .createAndEnterDirectory("dir_A")
+ .createFile("file_A1.java")
+ .createFile("file_A2.java")
+ .createFile("file_A3.java")
+ .up()
+ .createAndEnterDirectory("dir_B")
+ .createFile("file_B1.java")
+ .createFile("file_B2.java")
+ .createFile("file_B3.java")
+ .up()
+ .getPath();
+ // @formatter:on
+
+ var fileFilter = PathMatchers.hasExtension("java");
+
+ FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withChildLimit(limit))
+ .customizeOptions(options -> options.filterFiles(fileFilter))
+ .build();
+
+ var result = printer.prettyPrint(path);
+ assertThat(result).isEqualTo(expected);
+ }
+
+ @Test
+ void childLimit_1() {
+ var expected = """
+ targetPath/
+ ├─ dir_A/
+ │ ├─ file_A1.java
+ │ └─ ...
+ └─ ...""";
+
+ combine_filtering_and_childLimit(1, expected);
+ }
+
+ @Test
+ void childLimit_2() {
+ var expected = """
+ targetPath/
+ ├─ dir_A/
+ │ ├─ file_A1.java
+ │ ├─ file_A2.java
+ │ └─ ...
+ └─ dir_B/
+ ├─ file_B1.java
+ ├─ file_B2.java
+ └─ ...""";
+
+ combine_filtering_and_childLimit(2, expected);
+ }
+
+ @Test
+ void childLimit_3() {
+ var expected = """
+ targetPath/
+ ├─ dir_A/
+ │ ├─ file_A1.java
+ │ ├─ file_A2.java
+ │ └─ file_A3.java
+ └─ dir_B/
+ ├─ file_B1.java
+ ├─ file_B2.java
+ └─ file_B3.java""";
+
+ combine_filtering_and_childLimit(3, expected);
+ }
+
+ }
+
+ @Nested
+ class WithCompactDir {
+
+ @Test
+ void nominal() {
+
+ // @formatter:off
+ var path = FileStructureCreator
+ .forTargetPath(root)
+ .createAndEnterDirectory("level1-1")
+ .createAndEnterDirectory("level2-1")
+ .createAndEnterDirectory("level3-1")
+ .createFile("level3-1#1.java")
+ .createFile("level3-1#2.java")
+ .createFile("level3-1#3.java")
+ .createAndEnterDirectory("level4-1")
+ .createAndEnterDirectory("level5-1")
+ .createFile("level5-1#1.java")
+ .createFile("level5-1#2.java")
+ .createFile("level5-1#3.java")
+ .up() // level5
+ .up() // level4
+ .createAndEnterDirectory("level4-2")
+ .createAndEnterDirectory("level5-2")
+ .createFile("level5-2#1.java")
+ .createFile("level5-2#2.java")
+ .createFile("level5-2#3.java")
+ .up() // level5
+ .up() // level4
+ .up() // level3
+ .up() // level2
+ .up() // level1
+ .getPath();
+ // @formatter:on
+
+ var dirFilter = PathMatchers.hasNameEndingWith("1");
+ var fileFilter = PathMatchers.hasExtension("java");
+
+ FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
+ .customizeOptions(options -> options.withCompactDirectories(true))
+ .customizeOptions(options -> options.filterDirectories(dirFilter))
+ .customizeOptions(options -> options.filterFiles(fileFilter))
+ .build();
+
+ var result = printer.prettyPrint(path);
+ var expected = """
+ targetPath/
+ └─ level1-1/level2-1/level3-1/
+ ├─ level3-1#1.java
+ ├─ level3-1#2.java
+ ├─ level3-1#3.java
+ └─ level4-1/level5-1/
+ ├─ level5-1#1.java
+ ├─ level5-1#2.java
+ └─ level5-1#3.java""";
+ assertThat(result).isEqualTo(expected);
+ }
+
+ }
+
+}
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java
similarity index 69%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java
index c8d1263..aa355ed 100644
--- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java
+++ b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/LineExtensionTest.java
@@ -28,39 +28,6 @@ void emptyDir() {
assertThat(result).isEqualTo(expected);
}
- @Test
- void example_dir_match() {
-
- var printedPath = Path.of("src/example/resources/line_extension");
-
- Function lineExtension = LineExtensions.builder()
- .add(PathMatchers.hasRelativePathMatchingGlob(printedPath, "src/main/java/api"), "\t\t\t// All API code: controllers, etc.")
- .add(PathMatchers.hasRelativePathMatchingGlob(printedPath, "src/main/java/domain"), "\t\t\t// All domain code: value objects, etc.")
- .add(PathMatchers.hasRelativePathMatchingGlob(printedPath, "src/main/java/infra"), "\t\t\t// All infra code: database, email service, etc.")
- .add(PathMatchers.hasNameMatchingGlob("*.properties"), "\t// Config file")
- .build();
-
- var printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.withLineExtension(lineExtension))
- .build();
-
- var result = printer.prettyPrint(printedPath);
- var expected = """
- line_extension/
- └─ src/
- └─ main/
- ├─ java/
- │ ├─ api/ // All API code: controllers, etc.
- │ │ └─ Controller.java
- │ ├─ domain/ // All domain code: value objects, etc.
- │ │ └─ ValueObject.java
- │ └─ infra/ // All infra code: database, email service, etc.
- │ └─ Repository.java
- └─ resources/
- └─ application.properties // Config file""";
- assertThat(result).isEqualTo(expected);
- }
-
@Test
void compact_dir_first_dir() {
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/MaxDepthTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/MaxDepthTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/MaxDepthTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/MaxDepthTest.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchersTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchersTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchersTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathMatchersTest.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilderTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilderTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilderTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/PathSortBuilderTest.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java
similarity index 86%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java
index 2bb97d1..d9d1029 100644
--- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java
+++ b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/SortingTest.java
@@ -13,29 +13,6 @@ class SortingTest {
@TempDir
private Path root;
- @Test
- void example() {
-
- FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.sort(PathSorts.DIRECTORY_FIRST))
- .build();
-
- var result = printer.prettyPrint("src/example/resources/sorting");
- var expected = """
- sorting/
- ├─ c_dir/
- │ └─ c_file
- ├─ d_dir/
- │ ├─ d_b_dir/
- │ │ └─ d_b_file
- │ └─ d_a_file
- ├─ a_file
- ├─ b_file
- ├─ x_file
- └─ y_file""";
- assertThat(result).isEqualTo(expected);
- }
-
// ---------- Alphabetical ----------
private Path buildDefaultPath() {
@@ -111,19 +88,14 @@ void fileSize() {
.customizeOptions(options -> options.sort(PathSorts.BY_FILE_SIZE))
.build();
- var result = printer.prettyPrint("src/example/resources/sorting");
+ var result = printer.prettyPrint("src/test/resources/sorting/by_file_size");
var expected = """
- sorting/
- ├─ c_dir/
- │ └─ c_file
- ├─ d_dir/
- │ ├─ d_b_dir/
- │ │ └─ d_b_file
- │ └─ d_a_file
- ├─ y_file
- ├─ x_file
- ├─ a_file
- └─ b_file""";
+ by_file_size/
+ ├─ file_3
+ ├─ file_1
+ ├─ file_4
+ ├─ file_2
+ └─ file_5""";
assertThat(result).isEqualTo(expected);
}
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/TreeFormatTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/TreeFormatTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/TreeFormatTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/TreeFormatTest.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DepthTest.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DepthTest.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DepthTest.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer/DepthTest.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/util/FileStructureCreator.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/util/FileStructureCreator.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/util/FileStructureCreator.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/util/FileStructureCreator.java
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/util/FileStructures.java b/jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/util/FileStructures.java
similarity index 100%
rename from src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/util/FileStructures.java
rename to jfiletreeprettyprinter-core/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/util/FileStructures.java
diff --git a/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_1 b/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_1
new file mode 100644
index 0000000..274c005
--- /dev/null
+++ b/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_1
@@ -0,0 +1 @@
+1234
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_2 b/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_2
new file mode 100644
index 0000000..8615dba
--- /dev/null
+++ b/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_2
@@ -0,0 +1 @@
+1234567
\ No newline at end of file
diff --git a/src/example/resources/sorting/x_file b/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_3
similarity index 100%
rename from src/example/resources/sorting/x_file
rename to jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_3
diff --git a/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_4 b/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_4
new file mode 100644
index 0000000..bd41cba
--- /dev/null
+++ b/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_4
@@ -0,0 +1 @@
+12345
\ No newline at end of file
diff --git a/src/example/resources/sorting/b_file b/jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_5
similarity index 100%
rename from src/example/resources/sorting/b_file
rename to jfiletreeprettyprinter-core/src/test/resources/sorting/by_file_size/file_5
diff --git a/jfiletreeprettyprinter-examples/pom.xml b/jfiletreeprettyprinter-examples/pom.xml
new file mode 100644
index 0000000..cba604a
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/pom.xml
@@ -0,0 +1,35 @@
+
+ 4.0.0
+
+ io.github.computerdaddyguy
+ jfiletreeprettyprinter
+ ${revision}
+
+
+ jfiletreeprettyprinter-examples
+
+
+
+
+ io.github.computerdaddyguy
+ jfiletreeprettyprinter-core
+ ${revision}
+
+
+ org.jspecify
+ jspecify
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+
+
\ No newline at end of file
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/BasicUsage.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/BasicUsage.java
similarity index 69%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/BasicUsage.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/BasicUsage.java
index d47752f..1a144ee 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/BasicUsage.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/BasicUsage.java
@@ -5,9 +5,12 @@
public class BasicUsage {
public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
var prettyPrinter = FileTreePrettyPrinter.createDefault();
- var tree = prettyPrinter.prettyPrint("src/example/resources/base");
- System.out.println(tree);
+ return prettyPrinter.prettyPrint("src/main/resources/base");
}
}
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java
similarity index 84%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java
index 973764c..7cd86f3 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamic.java
@@ -7,6 +7,10 @@
public class ChildLimitDynamic {
public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
var childLimit = ChildLimits.builder()
.setDefault(ChildLimits.UNLIMITED) // Unlimited children by default
.add(PathMatchers.hasName("node_modules"), 0) // Do NOT print any children in "node_modules" folder
@@ -14,8 +18,7 @@ public static void main(String[] args) {
var prettyPrinter = FileTreePrettyPrinter.builder()
.customizeOptions(options -> options.withChildLimit(childLimit))
.build();
- var tree = prettyPrinter.prettyPrint("src/example/resources/child_limit_dynamic");
- System.out.println(tree);
+ return prettyPrinter.prettyPrint("src/main/resources/child_limit_dynamic");
}
}
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitStatic.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitStatic.java
similarity index 71%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitStatic.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitStatic.java
index f8d5e06..e61a035 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitStatic.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitStatic.java
@@ -5,11 +5,14 @@
public class ChildLimitStatic {
public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
var prettyPrinter = FileTreePrettyPrinter.builder()
.customizeOptions(options -> options.withChildLimit(3))
.build();
- var tree = prettyPrinter.prettyPrint("src/example/resources/child_limit_static");
- System.out.println(tree);
+ return prettyPrinter.prettyPrint("src/main/resources/child_limit_static");
}
}
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/CompactDirectories.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/CompactDirectories.java
similarity index 71%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/CompactDirectories.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/CompactDirectories.java
index d9373aa..685f62f 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/CompactDirectories.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/CompactDirectories.java
@@ -5,11 +5,14 @@
public class CompactDirectories {
public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
var prettyPrinter = FileTreePrettyPrinter.builder()
.customizeOptions(options -> options.withCompactDirectories(true))
.build();
- var tree = prettyPrinter.prettyPrint("src/example/resources/single_directory_child");
- System.out.println(tree);
+ return prettyPrinter.prettyPrint("src/main/resources/single_directory_child");
}
}
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Emojis.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Emojis.java
similarity index 75%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Emojis.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Emojis.java
index 925ea0a..fb7a859 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Emojis.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Emojis.java
@@ -5,11 +5,14 @@
public class Emojis {
public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
var prettyPrinter = FileTreePrettyPrinter.builder()
.customizeOptions(options -> options.withDefaultEmojis()) // or withEmojis(EmojiMapping) for custom mapping
.build();
- var tree = prettyPrinter.prettyPrint("src/example/resources/emojis");
- System.out.println(tree);
+ return prettyPrinter.prettyPrint("src/main/resources/emojis");
}
}
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java
similarity index 77%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java
index 5e83379..ddb9525 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormat.java
@@ -6,11 +6,14 @@
public class FileTreeFormat {
public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
var prettyPrinter = FileTreePrettyPrinter.builder()
.customizeOptions(options -> options.withTreeFormat(TreeFormats.CLASSIC_ASCII))
.build();
- var tree = prettyPrinter.prettyPrint("src/example/resources/tree_format");
- System.out.println(tree);
+ return prettyPrinter.prettyPrint("src/main/resources/tree_format");
}
}
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java
similarity index 83%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java
index be80241..dd73910 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Filtering.java
@@ -6,6 +6,10 @@
public class Filtering {
public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
var excludeDirWithNoJavaFiles = PathMatchers.not(PathMatchers.hasNameEndingWith("no_java_file"));
var hasJavaExtension = PathMatchers.hasExtension("java");
@@ -17,8 +21,7 @@ public static void main(String[] args) {
)
.build();
- var tree = prettyPrinter.prettyPrint("src/example/resources/filtering");
- System.out.println(tree);
+ return prettyPrinter.prettyPrint("src/main/resources/filtering");
}
}
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java
similarity index 87%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java
index f8500c1..9e432e8 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtension.java
@@ -9,7 +9,11 @@
public class LineExtension {
public static void main(String[] args) {
- var printedPath = Path.of("src/example/resources/line_extension");
+ System.out.println(run());
+ }
+
+ public static String run() {
+ var printedPath = Path.of("src/main/resources/line_extension");
Function lineExtension = LineExtensions.builder()
.add(PathMatchers.hasRelativePathMatchingGlob(printedPath, "src/main/java/api"), "\t\t\t// All API code: controllers, etc.")
@@ -22,8 +26,8 @@ public static void main(String[] args) {
var prettyPrinter = FileTreePrettyPrinter.builder()
.customizeOptions(options -> options.withLineExtension(lineExtension))
.build();
- var tree = prettyPrinter.prettyPrint(printedPath);
- System.out.println(tree);
+
+ return prettyPrinter.prettyPrint(printedPath);
}
}
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/MaxDepth.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/MaxDepth.java
similarity index 72%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/MaxDepth.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/MaxDepth.java
index d80c8a6..233e3b4 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/MaxDepth.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/MaxDepth.java
@@ -5,11 +5,14 @@
public class MaxDepth {
public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
var prettyPrinter = FileTreePrettyPrinter.builder()
.customizeOptions(options -> options.withMaxDepth(3))
.build();
- var tree = prettyPrinter.prettyPrint("src/example/resources/max_depth");
- System.out.println(tree);
+ return prettyPrinter.prettyPrint("src/main/resources/max_depth");
}
}
diff --git a/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java
new file mode 100644
index 0000000..011a826
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java
@@ -0,0 +1,158 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.ChildLimits;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.LineExtensions;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers;
+import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathSorts;
+import java.nio.file.Path;
+import java.util.Comparator;
+import java.util.function.Function;
+
+public class ProjectStructure {
+
+ /*
+ ================================
+ Expected result
+ ================================
+
+ 📂 JFileTreePrettyPrinter/
+ ├─ 📂 jfiletreeprettyprinter-core/ // The Java lib
+ │ ├─ 📂 src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/
+ │ │ └─ ☕ FileTreePrettyPrinter.java // Lib main entry point
+ │ └─ ...
+ ├─ 📂 jfiletreeprettyprinter-examples/ // Some examples
+ │ └─ ...
+ ├─ 📂 jfiletreeprettyprinter-cli/ // Everything to build the executable
+ │ └─ ...
+ ├─ 📂 assets/
+ │ └─ 🖼️ project-structure.png // This image
+ ├─ 📂 docs/
+ │ ├─ 📝 How-to-build-a-native-executable-locally.md
+ │ └─ 📝 Release-process.md
+ ├─ 🆕 CHANGELOG.md
+ ├─ 🤝 CONTRIBUTING.md
+ ├─ ⚖️ LICENSE
+ ├─ 📘 README.md // You're reading at this!
+ ├─ 🗺️ ROADMAP.md
+ ├─ 🛡️ SECURITY.md
+ ├─ 🛠️ pom.xml
+ └─ 📜 runMutationTests.sh
+
+ */
+
+ public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
+
+ /*
+ * ==========================================================================================
+ *
+ * Complete example code that pretty prints JFileTreePrettyPrint own project structure.
+ * See the result in image at: https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter
+ *
+ * ==========================================================================================
+ */
+
+ /*
+ * The folder to pretty print (= the JFileTreePrettyPrint project root)
+ */
+ var projectFolder = Path.of("..");
+
+ /*
+ * Filter for directories (visit and display only folders that pass this filter)
+ */
+ var dirFilter = PathMatchers.anyOf(
+ PathMatchers.hasAnyDescendantMatching(PathMatchers.hasName("FileTreePrettyPrinter.java")),
+ PathMatchers.noneOf(
+ // Exclude these folders from traversal
+ PathMatchers.hasNameStartingWith("."),
+ PathMatchers.hasRelativePathMatchingGlob(projectFolder, "target"),
+ PathMatchers.hasRelativePathMatchingGlob(projectFolder, "src"),
+ PathMatchers.hasRelativePathMatchingGlob(projectFolder, "*/src/**")
+ )
+ );
+
+ /*
+ * Filter for files (display only files that pass this filter)
+ * Note: files for which the parent folder does not match the directory filter
+ * are obviously not displayed, even if they pass the file filter.
+ */
+ var fileFilter = PathMatchers.anyOf(
+ PathMatchers.hasAbsolutePathMatchingGlob("**/jfiletreeprettyprinter-core/**/FileTreePrettyPrinter.java"),
+ PathMatchers.noneOf(
+ PathMatchers.hasAbsolutePathMatchingGlob("**/jfiletreeprettyprinter-core/**"),
+ PathMatchers.hasNameStartingWith(".")
+ )
+ );
+
+ PathMatchers.ifMatchesThenElse(
+ PathMatchers.hasAbsolutePathMatchingGlob("**/jfiletreeprettyprinter-core/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter"),
+ PathMatchers.hasName("FileTreePrettyPrinter.java"),
+ PathMatchers.noneOf(
+ PathMatchers.hasNameStartingWith(".")
+ )
+ );
+
+ /*
+ * Limit the number of displayed children by directory: some content is not relevant and clutters the final result!
+ */
+ var childLimitFunction = ChildLimits.builder()
+ // Hide all files under renderer and scanner packages
+ .add(PathMatchers.hasAbsolutePathMatchingGlob("**/jfiletreeprettyprinter-cli"), 0)
+ .add(PathMatchers.hasAbsolutePathMatchingGlob("**/jfiletreeprettyprinter-examples"), 0)
+ .add(PathMatchers.hasAbsolutePathMatchingGlob("**/jfiletreeprettyprinter-core"), 1)
+ .build();
+
+ /*
+ * Add some comments on a few files and directories
+ */
+ Function lineExtension = LineExtensions.builder()
+ .add(PathMatchers.hasName("project-structure.png"), "\t// This image")
+ .add(PathMatchers.hasName("README.md"), "\t\t// You're reading at this!")
+ .add(PathMatchers.hasName("FileTreePrettyPrinter.java"), "\t// Lib main entry point")
+ .add(PathMatchers.hasName("jfiletreeprettyprinter-cli"), "\t// Everything to build the executable")
+ .add(PathMatchers.hasName("jfiletreeprettyprinter-core"), "\t// The Java lib")
+ .add(PathMatchers.hasName("jfiletreeprettyprinter-examples"), "\t// Some examples")
+ .addLineBreak(PathMatchers.hasRelativePathMatchingGlob(projectFolder, "src/main/java"))
+ .build();
+
+ /*
+ * Sort all paths setting a precedence value. Default precedence is "0", lower values have higher precedence.
+ * Items having the same precedence value are then sorted alphabetically by default.
+ */
+ Comparator pathComparator = PathSorts.builder()
+ //
+ .add(PathMatchers.hasName("jfiletreeprettyprinter-core"), -100)
+ .add(PathMatchers.hasName("jfiletreeprettyprinter-examples"), -90)
+ .add(PathMatchers.hasName("jfiletreeprettyprinter-cli"), -80)
+ .add(PathMatchers.hasName("assets"), -70)
+ .add(PathMatchers.hasName("docs"), -60)
+ .add(PathMatchers.isDirectory(), -1)
+ .build();
+
+ /*
+ * Build the final FileTreePrettyPrinter
+ */
+ var prettyPrinter = FileTreePrettyPrinter.builder()
+ .customizeOptions(
+ options -> options
+ .withDefaultEmojis() // Use emojis!
+ .withCompactDirectories(true) // Inline directory chains: "src/main/java/..."
+ .filterDirectories(dirFilter)
+ .filterFiles(fileFilter)
+ .withChildLimit(childLimitFunction)
+ .withLineExtension(lineExtension)
+ .sort(pathComparator)
+ )
+ .build();
+
+ /*
+ * Pretty print and display the result!
+ */
+ return prettyPrinter.prettyPrint(projectFolder);
+ }
+
+}
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java
similarity index 77%
rename from src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java
rename to jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java
index 8a3973e..9519839 100644
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java
+++ b/jfiletreeprettyprinter-examples/src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/Sorting.java
@@ -6,11 +6,14 @@
public class Sorting {
public static void main(String[] args) {
+ System.out.println(run());
+ }
+
+ public static String run() {
var prettyPrinter = FileTreePrettyPrinter.builder()
.customizeOptions(options -> options.sort(PathSorts.DIRECTORY_FIRST))
.build();
- var tree = prettyPrinter.prettyPrint("src/example/resources/sorting");
- System.out.println(tree);
+ return prettyPrinter.prettyPrint("src/main/resources/sorting");
}
}
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_05 b/jfiletreeprettyprinter-examples/src/main/resources/base/businessPlan.pdf
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_05
rename to jfiletreeprettyprinter-examples/src/main/resources/base/businessPlan.pdf
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_06 b/jfiletreeprettyprinter-examples/src/main/resources/base/businessProject.pdf
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_06
rename to jfiletreeprettyprinter-examples/src/main/resources/base/businessProject.pdf
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_07 b/jfiletreeprettyprinter-examples/src/main/resources/base/cars/Ferrari.doc
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_07
rename to jfiletreeprettyprinter-examples/src/main/resources/base/cars/Ferrari.doc
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_08 b/jfiletreeprettyprinter-examples/src/main/resources/base/cars/Porsche.doc
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_08
rename to jfiletreeprettyprinter-examples/src/main/resources/base/cars/Porsche.doc
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_09 b/jfiletreeprettyprinter-examples/src/main/resources/base/diyIdeas.docx
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_09
rename to jfiletreeprettyprinter-examples/src/main/resources/base/diyIdeas.docx
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_10 b/jfiletreeprettyprinter-examples/src/main/resources/base/giftIdeas.txt
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_10
rename to jfiletreeprettyprinter-examples/src/main/resources/base/giftIdeas.txt
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_11 b/jfiletreeprettyprinter-examples/src/main/resources/base/images/funnyCat.gif
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_11
rename to jfiletreeprettyprinter-examples/src/main/resources/base/images/funnyCat.gif
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_12 b/jfiletreeprettyprinter-examples/src/main/resources/base/images/holidays/meAtTheBeach.jpeg
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_12
rename to jfiletreeprettyprinter-examples/src/main/resources/base/images/holidays/meAtTheBeach.jpeg
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_13 b/jfiletreeprettyprinter-examples/src/main/resources/base/images/holidays/meAtTheZoo.jpeg
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_13
rename to jfiletreeprettyprinter-examples/src/main/resources/base/images/holidays/meAtTheZoo.jpeg
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_14 b/jfiletreeprettyprinter-examples/src/main/resources/base/images/landscape.jpeg
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_14
rename to jfiletreeprettyprinter-examples/src/main/resources/base/images/landscape.jpeg
diff --git a/src/example/resources/child_limit_static/file_0_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/file_0_1
similarity index 100%
rename from src/example/resources/child_limit_static/file_0_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/file_0_1
diff --git a/src/example/resources/child_limit_static/folder_1/file_1_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_1
similarity index 100%
rename from src/example/resources/child_limit_static/folder_1/file_1_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_1
diff --git a/src/example/resources/child_limit_static/folder_1/file_1_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_2
similarity index 100%
rename from src/example/resources/child_limit_static/folder_1/file_1_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_2
diff --git a/src/example/resources/child_limit_static/folder_1/file_1_3 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_3
similarity index 100%
rename from src/example/resources/child_limit_static/folder_1/file_1_3
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_3
diff --git a/src/example/resources/child_limit_static/folder_1/file_1_4 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_4
similarity index 100%
rename from src/example/resources/child_limit_static/folder_1/file_1_4
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_4
diff --git a/src/example/resources/child_limit_static/folder_1/file_1_5 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_5
similarity index 100%
rename from src/example/resources/child_limit_static/folder_1/file_1_5
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/folder_1/file_1_5
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_15 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_01
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_15
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_01
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_16 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_02
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_16
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_02
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_17 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_03
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_17
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_03
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_18 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_04
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_18
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_04
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_19 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_05
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_19
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_05
diff --git a/src/example/resources/child_limit_dynamic/node_modules/file_node_20 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_06
similarity index 100%
rename from src/example/resources/child_limit_dynamic/node_modules/file_node_20
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_06
diff --git a/src/example/resources/child_limit_static/folder_2/file_2_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_07
similarity index 100%
rename from src/example/resources/child_limit_static/folder_2/file_2_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_07
diff --git a/src/example/resources/child_limit_static/folder_2/file_2_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_08
similarity index 100%
rename from src/example/resources/child_limit_static/folder_2/file_2_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_08
diff --git a/src/example/resources/child_limit_static/folder_2/file_2_3 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_09
similarity index 100%
rename from src/example/resources/child_limit_static/folder_2/file_2_3
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_09
diff --git a/src/example/resources/child_limit_static/folder_2/file_2_4 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_10
similarity index 100%
rename from src/example/resources/child_limit_static/folder_2/file_2_4
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_10
diff --git a/src/example/resources/child_limit_static/folder_2/file_2_5 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_11
similarity index 100%
rename from src/example/resources/child_limit_static/folder_2/file_2_5
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_11
diff --git a/src/example/resources/child_limit_static/folder_3/file_3_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_12
similarity index 100%
rename from src/example/resources/child_limit_static/folder_3/file_3_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_12
diff --git a/src/example/resources/child_limit_static/folder_3/file_3_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_13
similarity index 100%
rename from src/example/resources/child_limit_static/folder_3/file_3_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_13
diff --git a/src/example/resources/child_limit_static/folder_3/file_3_3 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_14
similarity index 100%
rename from src/example/resources/child_limit_static/folder_3/file_3_3
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_14
diff --git a/src/example/resources/child_limit_static/folder_3/file_3_4 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_15
similarity index 100%
rename from src/example/resources/child_limit_static/folder_3/file_3_4
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_15
diff --git a/src/example/resources/child_limit_static/folder_3/file_3_5 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_16
similarity index 100%
rename from src/example/resources/child_limit_static/folder_3/file_3_5
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_16
diff --git a/src/example/resources/child_limit_static/folder_4/file_4_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_17
similarity index 100%
rename from src/example/resources/child_limit_static/folder_4/file_4_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_17
diff --git a/src/example/resources/child_limit_static/folder_4/file_4_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_18
similarity index 100%
rename from src/example/resources/child_limit_static/folder_4/file_4_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_18
diff --git a/src/example/resources/child_limit_static/folder_4/file_4_3 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_19
similarity index 100%
rename from src/example/resources/child_limit_static/folder_4/file_4_3
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_19
diff --git a/src/example/resources/child_limit_static/folder_4/file_4_4 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_20
similarity index 100%
rename from src/example/resources/child_limit_static/folder_4/file_4_4
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_dynamic/node_modules/file_node_20
diff --git a/src/example/resources/child_limit_static/folder_4/file_4_5 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/file_0_1
similarity index 100%
rename from src/example/resources/child_limit_static/folder_4/file_4_5
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/file_0_1
diff --git a/src/example/resources/depth_limit/level_1/file_1_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_1
similarity index 100%
rename from src/example/resources/depth_limit/level_1/file_1_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_1
diff --git a/src/example/resources/depth_limit/level_1/file_1_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_2
similarity index 100%
rename from src/example/resources/depth_limit/level_1/file_1_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_2
diff --git a/src/example/resources/child_limit_static/folder_5/file_5_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_3
similarity index 100%
rename from src/example/resources/child_limit_static/folder_5/file_5_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_3
diff --git a/src/example/resources/child_limit_static/folder_5/file_5_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_4
similarity index 100%
rename from src/example/resources/child_limit_static/folder_5/file_5_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_4
diff --git a/src/example/resources/child_limit_static/folder_5/file_5_3 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_5
similarity index 100%
rename from src/example/resources/child_limit_static/folder_5/file_5_3
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_1/file_1_5
diff --git a/src/example/resources/depth_limit/level_1/level_2/file_2_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_1
similarity index 100%
rename from src/example/resources/depth_limit/level_1/level_2/file_2_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_1
diff --git a/src/example/resources/depth_limit/level_1/level_2/file_2_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_2
similarity index 100%
rename from src/example/resources/depth_limit/level_1/level_2/file_2_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_2
diff --git a/src/example/resources/child_limit_static/folder_5/file_5_4 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_3
similarity index 100%
rename from src/example/resources/child_limit_static/folder_5/file_5_4
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_3
diff --git a/src/example/resources/child_limit_static/folder_5/file_5_5 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_4
similarity index 100%
rename from src/example/resources/child_limit_static/folder_5/file_5_5
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_4
diff --git a/src/example/resources/depth_limit/level_1/level_2/level_3/file_3_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_5
similarity index 100%
rename from src/example/resources/depth_limit/level_1/level_2/level_3/file_3_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_2/file_2_5
diff --git a/src/example/resources/depth_limit/level_1/level_2/level_3/file_3_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_1
similarity index 100%
rename from src/example/resources/depth_limit/level_1/level_2/level_3/file_3_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_1
diff --git a/src/example/resources/depth_limit/level_1/level_2/level_3/level_4/file_4_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_2
similarity index 100%
rename from src/example/resources/depth_limit/level_1/level_2/level_3/level_4/file_4_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_2
diff --git a/src/example/resources/depth_limit/level_1/level_2/level_3/level_4/file_4_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_3
similarity index 100%
rename from src/example/resources/depth_limit/level_1/level_2/level_3/level_4/file_4_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_3
diff --git a/src/example/resources/depth_limit/level_1/level_2/level_3/level_4/level_5/file_5_1 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_4
similarity index 100%
rename from src/example/resources/depth_limit/level_1/level_2/level_3/level_4/level_5/file_5_1
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_4
diff --git a/src/example/resources/depth_limit/level_1/level_2/level_3/level_4/level_5/file_5_2 b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_5
similarity index 100%
rename from src/example/resources/depth_limit/level_1/level_2/level_3/level_4/level_5/file_5_2
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_3/file_3_5
diff --git a/src/example/resources/emojis/applications/executables/file.apk b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_1
similarity index 100%
rename from src/example/resources/emojis/applications/executables/file.apk
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_1
diff --git a/src/example/resources/emojis/applications/executables/file.app b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_2
similarity index 100%
rename from src/example/resources/emojis/applications/executables/file.app
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_2
diff --git a/src/example/resources/emojis/applications/executables/file.bin b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_3
similarity index 100%
rename from src/example/resources/emojis/applications/executables/file.bin
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_3
diff --git a/src/example/resources/emojis/applications/executables/file.exe b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_4
similarity index 100%
rename from src/example/resources/emojis/applications/executables/file.exe
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_4
diff --git a/src/example/resources/emojis/applications/executables/file.msi b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_5
similarity index 100%
rename from src/example/resources/emojis/applications/executables/file.msi
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_4/file_4_5
diff --git a/src/example/resources/emojis/applications/executables/file2.ipa b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_1
similarity index 100%
rename from src/example/resources/emojis/applications/executables/file2.ipa
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_1
diff --git a/src/example/resources/emojis/applications/libs/file.dll b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_2
similarity index 100%
rename from src/example/resources/emojis/applications/libs/file.dll
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_2
diff --git a/src/example/resources/emojis/applications/libs/file.lib b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_3
similarity index 100%
rename from src/example/resources/emojis/applications/libs/file.lib
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_3
diff --git a/src/example/resources/emojis/applications/libs/file.so b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_4
similarity index 100%
rename from src/example/resources/emojis/applications/libs/file.so
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_4
diff --git a/src/example/resources/emojis/archives/file.7z b/jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_5
similarity index 100%
rename from src/example/resources/emojis/archives/file.7z
rename to jfiletreeprettyprinter-examples/src/main/resources/child_limit_static/folder_5/file_5_5
diff --git a/jfiletreeprettyprinter-examples/src/main/resources/cli/options/full-options.yaml b/jfiletreeprettyprinter-examples/src/main/resources/cli/options/full-options.yaml
new file mode 100644
index 0000000..1bd2aa9
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/main/resources/cli/options/full-options.yaml
@@ -0,0 +1,38 @@
+emojis: true
+maxDepth: 2
+compactDirectories: true
+childLimit:
+ type: dynamic
+ limits:
+ - limit: 2
+ matcher:
+ type: noneOf
+ matchers:
+ - type: name
+ glob: "*a"
+ - type: name
+ glob: "folder*"
+ - limit: 3
+ matcher:
+ type: noneOf
+ matchers:
+ - type: name
+ glob: "*a"
+ - type: name
+ glob: "*xxx*"
+lineExtensions:
+ - extension: " // This is java file"
+ matcher:
+ type: name
+ glob: "*.java"
+ - extension: " // This is php file"
+ matcher:
+ type: name
+ glob: "*.php"
+filter:
+ dir:
+ type: name
+ glob: "*a"
+ file:
+ type: name
+ glob: "*.java"
\ No newline at end of file
diff --git a/src/example/resources/emojis/archives/file.gz b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/file_1_1
similarity index 100%
rename from src/example/resources/emojis/archives/file.gz
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/file_1_1
diff --git a/src/example/resources/emojis/archives/file.img b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/file_1_2
similarity index 100%
rename from src/example/resources/emojis/archives/file.img
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/file_1_2
diff --git a/src/example/resources/emojis/archives/file.iso b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/file_2_1
similarity index 100%
rename from src/example/resources/emojis/archives/file.iso
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/file_2_1
diff --git a/src/example/resources/emojis/archives/file.rar b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/file_2_2
similarity index 100%
rename from src/example/resources/emojis/archives/file.rar
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/file_2_2
diff --git a/src/example/resources/emojis/archives/file.tar b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/file_3_1
similarity index 100%
rename from src/example/resources/emojis/archives/file.tar
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/file_3_1
diff --git a/src/example/resources/emojis/archives/file.zip b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/file_3_2
similarity index 100%
rename from src/example/resources/emojis/archives/file.zip
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/file_3_2
diff --git a/src/example/resources/emojis/code/.gitignore b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/level_4/file_4_1
similarity index 100%
rename from src/example/resources/emojis/code/.gitignore
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/level_4/file_4_1
diff --git a/src/example/resources/emojis/code/Dockerfile b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/level_4/file_4_2
similarity index 100%
rename from src/example/resources/emojis/code/Dockerfile
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/level_4/file_4_2
diff --git a/src/example/resources/emojis/code/Jenkinsfile b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/level_4/level_5/file_5_1
similarity index 100%
rename from src/example/resources/emojis/code/Jenkinsfile
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/level_4/level_5/file_5_1
diff --git a/src/example/resources/emojis/code/build_tools/build.gradle b/jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/level_4/level_5/file_5_2
similarity index 100%
rename from src/example/resources/emojis/code/build_tools/build.gradle
rename to jfiletreeprettyprinter-examples/src/main/resources/depth_limit/level_1/level_2/level_3/level_4/level_5/file_5_2
diff --git a/src/example/resources/emojis/code/build_tools/makefile b/jfiletreeprettyprinter-examples/src/main/resources/emojis/Dockerfile
similarity index 100%
rename from src/example/resources/emojis/code/build_tools/makefile
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/Dockerfile
diff --git a/src/example/resources/emojis/code/build_tools/package.json b/jfiletreeprettyprinter-examples/src/main/resources/emojis/Jenkinsfile
similarity index 100%
rename from src/example/resources/emojis/code/build_tools/package.json
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/Jenkinsfile
diff --git a/src/example/resources/emojis/media/video/file.avi b/jfiletreeprettyprinter-examples/src/main/resources/emojis/file.avi
similarity index 100%
rename from src/example/resources/emojis/media/video/file.avi
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/file.avi
diff --git a/src/example/resources/emojis/doc/file.docx b/jfiletreeprettyprinter-examples/src/main/resources/emojis/file.docx
similarity index 100%
rename from src/example/resources/emojis/doc/file.docx
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/file.docx
diff --git a/src/example/resources/emojis/data/file.ini b/jfiletreeprettyprinter-examples/src/main/resources/emojis/file.ini
similarity index 100%
rename from src/example/resources/emojis/data/file.ini
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/file.ini
diff --git a/src/example/resources/emojis/code/lang/file.java b/jfiletreeprettyprinter-examples/src/main/resources/emojis/file.java
similarity index 100%
rename from src/example/resources/emojis/code/lang/file.java
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/file.java
diff --git a/src/example/resources/emojis/media/images/file.jpeg b/jfiletreeprettyprinter-examples/src/main/resources/emojis/file.jpeg
similarity index 100%
rename from src/example/resources/emojis/media/images/file.jpeg
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/file.jpeg
diff --git a/src/example/resources/emojis/media/audio/file.mp3 b/jfiletreeprettyprinter-examples/src/main/resources/emojis/file.mp3
similarity index 100%
rename from src/example/resources/emojis/media/audio/file.mp3
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/file.mp3
diff --git a/src/example/resources/emojis/doc/file.pdf b/jfiletreeprettyprinter-examples/src/main/resources/emojis/file.pdf
similarity index 100%
rename from src/example/resources/emojis/doc/file.pdf
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/file.pdf
diff --git a/src/example/resources/emojis/data/file.xlsx b/jfiletreeprettyprinter-examples/src/main/resources/emojis/file.xlsx
similarity index 100%
rename from src/example/resources/emojis/data/file.xlsx
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/file.xlsx
diff --git a/src/example/resources/emojis/code/build_tools/pom.xml b/jfiletreeprettyprinter-examples/src/main/resources/emojis/file.zip
similarity index 100%
rename from src/example/resources/emojis/code/build_tools/pom.xml
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/file.zip
diff --git a/src/example/resources/emojis/internet/github/readme b/jfiletreeprettyprinter-examples/src/main/resources/emojis/readme
similarity index 100%
rename from src/example/resources/emojis/internet/github/readme
rename to jfiletreeprettyprinter-examples/src/main/resources/emojis/readme
diff --git a/src/example/resources/filtering/dir_with_java_files/file_B.java b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_java_files/file_B.java
similarity index 100%
rename from src/example/resources/filtering/dir_with_java_files/file_B.java
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_java_files/file_B.java
diff --git a/src/example/resources/filtering/dir_with_java_files/file_C.cpp b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_java_files/file_C.cpp
similarity index 100%
rename from src/example/resources/filtering/dir_with_java_files/file_C.cpp
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_java_files/file_C.cpp
diff --git a/src/example/resources/filtering/dir_with_java_files/file_D.ts b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_java_files/file_D.ts
similarity index 100%
rename from src/example/resources/filtering/dir_with_java_files/file_D.ts
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_java_files/file_D.ts
diff --git a/src/example/resources/filtering/dir_with_java_files/file_E.java b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_java_files/file_E.java
similarity index 100%
rename from src/example/resources/filtering/dir_with_java_files/file_E.java
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_java_files/file_E.java
diff --git a/src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_G.java b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_G.java
similarity index 100%
rename from src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_G.java
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_G.java
diff --git a/src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_H.cpp b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_H.cpp
similarity index 100%
rename from src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_H.cpp
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_H.cpp
diff --git a/src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_I.ts b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_I.ts
similarity index 100%
rename from src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_I.ts
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_I.ts
diff --git a/src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_J.java b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_J.java
similarity index 100%
rename from src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_J.java
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_java_files/file_J.java
diff --git a/src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_no_java_file/file_K.cpp b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_no_java_file/file_K.cpp
similarity index 100%
rename from src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_no_java_file/file_K.cpp
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_no_java_file/file_K.cpp
diff --git a/src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_no_java_file/file_L.ts b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_no_java_file/file_L.ts
similarity index 100%
rename from src/example/resources/filtering/dir_with_nested_java_files/nested_dir_with_no_java_file/file_L.ts
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_nested_java_files/nested_dir_with_no_java_file/file_L.ts
diff --git a/src/example/resources/filtering/dir_with_no_java_file/file_M.cpp b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_no_java_file/file_M.cpp
similarity index 100%
rename from src/example/resources/filtering/dir_with_no_java_file/file_M.cpp
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_no_java_file/file_M.cpp
diff --git a/src/example/resources/filtering/dir_with_no_java_file/file_N.ts b/jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_no_java_file/file_N.ts
similarity index 100%
rename from src/example/resources/filtering/dir_with_no_java_file/file_N.ts
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/dir_with_no_java_file/file_N.ts
diff --git a/src/example/resources/filtering/file_A.java b/jfiletreeprettyprinter-examples/src/main/resources/filtering/file_A.java
similarity index 100%
rename from src/example/resources/filtering/file_A.java
rename to jfiletreeprettyprinter-examples/src/main/resources/filtering/file_A.java
diff --git a/src/example/resources/line_extension/src/main/java/api/Controller.java b/jfiletreeprettyprinter-examples/src/main/resources/line_extension/src/main/java/api/Controller.java
similarity index 100%
rename from src/example/resources/line_extension/src/main/java/api/Controller.java
rename to jfiletreeprettyprinter-examples/src/main/resources/line_extension/src/main/java/api/Controller.java
diff --git a/src/example/resources/line_extension/src/main/java/domain/ValueObject.java b/jfiletreeprettyprinter-examples/src/main/resources/line_extension/src/main/java/domain/ValueObject.java
similarity index 100%
rename from src/example/resources/line_extension/src/main/java/domain/ValueObject.java
rename to jfiletreeprettyprinter-examples/src/main/resources/line_extension/src/main/java/domain/ValueObject.java
diff --git a/src/example/resources/line_extension/src/main/java/infra/Repository.java b/jfiletreeprettyprinter-examples/src/main/resources/line_extension/src/main/java/infra/Repository.java
similarity index 100%
rename from src/example/resources/line_extension/src/main/java/infra/Repository.java
rename to jfiletreeprettyprinter-examples/src/main/resources/line_extension/src/main/java/infra/Repository.java
diff --git a/src/example/resources/line_extension/src/main/resources/application.properties b/jfiletreeprettyprinter-examples/src/main/resources/line_extension/src/main/resources/application.properties
similarity index 100%
rename from src/example/resources/line_extension/src/main/resources/application.properties
rename to jfiletreeprettyprinter-examples/src/main/resources/line_extension/src/main/resources/application.properties
diff --git a/src/example/resources/max_depth/level1/file1#1 b/jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/file1#1
similarity index 100%
rename from src/example/resources/max_depth/level1/file1#1
rename to jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/file1#1
diff --git a/src/example/resources/max_depth/level1/file1#2 b/jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/file1#2
similarity index 100%
rename from src/example/resources/max_depth/level1/file1#2
rename to jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/file1#2
diff --git a/src/example/resources/max_depth/level1/level2/file2#1 b/jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/file2#1
similarity index 100%
rename from src/example/resources/max_depth/level1/level2/file2#1
rename to jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/file2#1
diff --git a/src/example/resources/max_depth/level1/level2/file2#2 b/jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/file2#2
similarity index 100%
rename from src/example/resources/max_depth/level1/level2/file2#2
rename to jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/file2#2
diff --git a/src/example/resources/max_depth/level1/level2/level3/file3#1 b/jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/level3/file3#1
similarity index 100%
rename from src/example/resources/max_depth/level1/level2/level3/file3#1
rename to jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/level3/file3#1
diff --git a/src/example/resources/max_depth/level1/level2/level3/file3#2 b/jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/level3/file3#2
similarity index 100%
rename from src/example/resources/max_depth/level1/level2/level3/file3#2
rename to jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/level3/file3#2
diff --git a/src/example/resources/max_depth/level1/level2/level3/level4/file4#1 b/jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/level3/level4/file4#1
similarity index 100%
rename from src/example/resources/max_depth/level1/level2/level3/level4/file4#1
rename to jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/level3/level4/file4#1
diff --git a/src/example/resources/max_depth/level1/level2/level3/level4/file4#2 b/jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/level3/level4/file4#2
similarity index 100%
rename from src/example/resources/max_depth/level1/level2/level3/level4/file4#2
rename to jfiletreeprettyprinter-examples/src/main/resources/max_depth/level1/level2/level3/level4/file4#2
diff --git a/src/example/resources/single_directory_child/file1 b/jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/file1
similarity index 100%
rename from src/example/resources/single_directory_child/file1
rename to jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/file1
diff --git a/src/example/resources/single_directory_child/file2 b/jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/file2
similarity index 100%
rename from src/example/resources/single_directory_child/file2
rename to jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/file2
diff --git a/src/example/resources/single_directory_child/this/is/single/directory/child/file1 b/jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/this/is/single/directory/child/file1
similarity index 100%
rename from src/example/resources/single_directory_child/this/is/single/directory/child/file1
rename to jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/this/is/single/directory/child/file1
diff --git a/src/example/resources/single_directory_child/this/is/single/directory/child/file2 b/jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/this/is/single/directory/child/file2
similarity index 100%
rename from src/example/resources/single_directory_child/this/is/single/directory/child/file2
rename to jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/this/is/single/directory/child/file2
diff --git a/src/example/resources/single_directory_child/this/is/single/directory/child/file3 b/jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/this/is/single/directory/child/file3
similarity index 100%
rename from src/example/resources/single_directory_child/this/is/single/directory/child/file3
rename to jfiletreeprettyprinter-examples/src/main/resources/single_directory_child/this/is/single/directory/child/file3
diff --git a/src/example/resources/sorting/a_file b/jfiletreeprettyprinter-examples/src/main/resources/sorting/a_file
similarity index 100%
rename from src/example/resources/sorting/a_file
rename to jfiletreeprettyprinter-examples/src/main/resources/sorting/a_file
diff --git a/jfiletreeprettyprinter-examples/src/main/resources/sorting/b_file b/jfiletreeprettyprinter-examples/src/main/resources/sorting/b_file
new file mode 100644
index 0000000..e2e107a
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/main/resources/sorting/b_file
@@ -0,0 +1 @@
+123456789
\ No newline at end of file
diff --git a/src/example/resources/sorting/c_dir/c_file b/jfiletreeprettyprinter-examples/src/main/resources/sorting/c_dir/c_file
similarity index 100%
rename from src/example/resources/sorting/c_dir/c_file
rename to jfiletreeprettyprinter-examples/src/main/resources/sorting/c_dir/c_file
diff --git a/src/example/resources/sorting/d_dir/d_a_file b/jfiletreeprettyprinter-examples/src/main/resources/sorting/d_dir/d_a_file
similarity index 100%
rename from src/example/resources/sorting/d_dir/d_a_file
rename to jfiletreeprettyprinter-examples/src/main/resources/sorting/d_dir/d_a_file
diff --git a/src/example/resources/sorting/d_dir/d_b_dir/d_b_file b/jfiletreeprettyprinter-examples/src/main/resources/sorting/d_dir/d_b_dir/d_b_file
similarity index 100%
rename from src/example/resources/sorting/d_dir/d_b_dir/d_b_file
rename to jfiletreeprettyprinter-examples/src/main/resources/sorting/d_dir/d_b_dir/d_b_file
diff --git a/jfiletreeprettyprinter-examples/src/main/resources/sorting/x_file b/jfiletreeprettyprinter-examples/src/main/resources/sorting/x_file
new file mode 100644
index 0000000..d800886
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/main/resources/sorting/x_file
@@ -0,0 +1 @@
+123
\ No newline at end of file
diff --git a/src/example/resources/sorting/y_file b/jfiletreeprettyprinter-examples/src/main/resources/sorting/y_file
similarity index 100%
rename from src/example/resources/sorting/y_file
rename to jfiletreeprettyprinter-examples/src/main/resources/sorting/y_file
diff --git a/src/example/resources/tree_format/file_1 b/jfiletreeprettyprinter-examples/src/main/resources/tree_format/file_1
similarity index 100%
rename from src/example/resources/tree_format/file_1
rename to jfiletreeprettyprinter-examples/src/main/resources/tree_format/file_1
diff --git a/src/example/resources/tree_format/file_2 b/jfiletreeprettyprinter-examples/src/main/resources/tree_format/file_2
similarity index 100%
rename from src/example/resources/tree_format/file_2
rename to jfiletreeprettyprinter-examples/src/main/resources/tree_format/file_2
diff --git a/src/example/resources/tree_format/subFolder/subFile_1 b/jfiletreeprettyprinter-examples/src/main/resources/tree_format/subFolder/subFile_1
similarity index 100%
rename from src/example/resources/tree_format/subFolder/subFile_1
rename to jfiletreeprettyprinter-examples/src/main/resources/tree_format/subFolder/subFile_1
diff --git a/src/example/resources/tree_format/subFolder/subFile_2 b/jfiletreeprettyprinter-examples/src/main/resources/tree_format/subFolder/subFile_2
similarity index 100%
rename from src/example/resources/tree_format/subFolder/subFile_2
rename to jfiletreeprettyprinter-examples/src/main/resources/tree_format/subFolder/subFile_2
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/BasicUsageTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/BasicUsageTest.java
new file mode 100644
index 0000000..cdb1282
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/BasicUsageTest.java
@@ -0,0 +1,32 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class BasicUsageTest {
+
+ @Test
+ void test() {
+ var result = BasicUsage.run();
+
+ var expected = """
+ base/
+ ├─ businessPlan.pdf
+ ├─ businessProject.pdf
+ ├─ cars/
+ │ ├─ Ferrari.doc
+ │ └─ Porsche.doc
+ ├─ diyIdeas.docx
+ ├─ giftIdeas.txt
+ └─ images/
+ ├─ funnyCat.gif
+ ├─ holidays/
+ │ ├─ meAtTheBeach.jpeg
+ │ └─ meAtTheZoo.jpeg
+ └─ landscape.jpeg""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamicTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamicTest.java
new file mode 100644
index 0000000..876af59
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitDynamicTest.java
@@ -0,0 +1,28 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class ChildLimitDynamicTest {
+
+ @Test
+ void test() {
+ var result = ChildLimitDynamic.run();
+
+ var expected = """
+ child_limit_dynamic/
+ ├─ file_0_1
+ ├─ folder_1/
+ │ ├─ file_1_1
+ │ ├─ file_1_2
+ │ ├─ file_1_3
+ │ ├─ file_1_4
+ │ └─ file_1_5
+ └─ node_modules/
+ └─ ...""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitStaticTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitStaticTest.java
new file mode 100644
index 0000000..fde1e9a
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ChildLimitStaticTest.java
@@ -0,0 +1,31 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class ChildLimitStaticTest {
+
+ @Test
+ void test() {
+ var result = ChildLimitStatic.run();
+
+ var expected = """
+ child_limit_static/
+ ├─ file_0_1
+ ├─ folder_1/
+ │ ├─ file_1_1
+ │ ├─ file_1_2
+ │ ├─ file_1_3
+ │ └─ ...
+ ├─ folder_2/
+ │ ├─ file_2_1
+ │ ├─ file_2_2
+ │ ├─ file_2_3
+ │ └─ ...
+ └─ ...""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/CompactDirectoriesTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/CompactDirectoriesTest.java
new file mode 100644
index 0000000..c074d58
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/CompactDirectoriesTest.java
@@ -0,0 +1,25 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class CompactDirectoriesTest {
+
+ @Test
+ void test() {
+ var result = CompactDirectories.run();
+
+ var expected = """
+ single_directory_child/
+ ├─ file1
+ ├─ file2
+ └─ this/is/single/directory/child/
+ ├─ file1
+ ├─ file2
+ └─ file3""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/EmojisTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/EmojisTest.java
new file mode 100644
index 0000000..417d698
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/EmojisTest.java
@@ -0,0 +1,31 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class EmojisTest {
+
+ @Test
+ void test() {
+ var result = Emojis.run();
+
+ var expected = """
+ 📂 emojis/
+ ├─ 🐳 Dockerfile
+ ├─ 🤵 Jenkinsfile
+ ├─ 🎬 file.avi
+ ├─ 📝 file.docx
+ ├─ ⚙️ file.ini
+ ├─ ☕ file.java
+ ├─ 🖼️ file.jpeg
+ ├─ 🎵 file.mp3
+ ├─ 📕 file.pdf
+ ├─ 📊 file.xlsx
+ ├─ 📦 file.zip
+ └─ 📘 readme""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormatTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormatTest.java
new file mode 100644
index 0000000..55cda6d
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FileTreeFormatTest.java
@@ -0,0 +1,24 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class FileTreeFormatTest {
+
+ @Test
+ void test() {
+ var result = FileTreeFormat.run();
+
+ var expected = """
+ tree_format/
+ |-- file_1
+ |-- file_2
+ `-- subFolder/
+ |-- subFile_1
+ `-- subFile_2""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FilteringTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FilteringTest.java
new file mode 100644
index 0000000..9a5f147
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/FilteringTest.java
@@ -0,0 +1,27 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class FilteringTest {
+
+ @Test
+ void test() {
+ var result = Filtering.run();
+
+ var expected = """
+ filtering/
+ ├─ dir_with_java_files/
+ │ ├─ file_B.java
+ │ └─ file_E.java
+ ├─ dir_with_nested_java_files/
+ │ └─ nested_dir_with_java_files/
+ │ ├─ file_G.java
+ │ └─ file_J.java
+ └─ file_A.java""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtensionTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtensionTest.java
new file mode 100644
index 0000000..9a92d70
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/LineExtensionTest.java
@@ -0,0 +1,30 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class LineExtensionTest {
+
+ @Test
+ void test() {
+ var result = LineExtension.run();
+
+ var expected = """
+ line_extension/
+ └─ src/
+ └─ main/
+ ├─ java/
+ │ ├─ api/ // All API code: controllers, etc.
+ │ │ └─ Controller.java
+ │ ├─ domain/ // All domain code: value objects, etc.
+ │ │ └─ ValueObject.java
+ │ └─ infra/ // All infra code: database, email service, etc.
+ │ └─ Repository.java
+ └─ resources/
+ └─ application.properties // Config file""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/MaxDepthTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/MaxDepthTest.java
new file mode 100644
index 0000000..ac034ba
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/MaxDepthTest.java
@@ -0,0 +1,27 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class MaxDepthTest {
+
+ @Test
+ void test() {
+ var result = MaxDepth.run();
+
+ var expected = """
+ max_depth/
+ └─ level1/
+ ├─ file1#1
+ ├─ file1#2
+ └─ level2/
+ ├─ file2#1
+ ├─ file2#2
+ └─ level3/
+ └─ ...""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructureTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructureTest.java
new file mode 100644
index 0000000..8bad591
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructureTest.java
@@ -0,0 +1,40 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class ProjectStructureTest {
+
+ @Test
+ void test() {
+ var result = ProjectStructure.run();
+
+ var expected = """
+ 📂 JFileTreePrettyPrinter/
+ ├─ 📂 jfiletreeprettyprinter-core/ // The Java lib
+ │ ├─ 📂 src/main/java/io/github/computerdaddyguy/jfiletreeprettyprinter/
+ │ │ └─ ☕ FileTreePrettyPrinter.java // Lib main entry point
+ │ └─ ...
+ ├─ 📂 jfiletreeprettyprinter-examples/ // Some examples
+ │ └─ ...
+ ├─ 📂 jfiletreeprettyprinter-cli/ // Everything to build the executable
+ │ └─ ...
+ ├─ 📂 assets/
+ │ └─ 🖼️ project-structure.png // This image
+ ├─ 📂 docs/
+ │ ├─ 📝 How-to-build-a-native-executable-locally.md
+ │ └─ 📝 Release-process.md
+ ├─ 🆕 CHANGELOG.md
+ ├─ 🤝 CONTRIBUTING.md
+ ├─ ⚖️ LICENSE
+ ├─ 📘 README.md // You're reading at this!
+ ├─ 🗺️ ROADMAP.md
+ ├─ 🛡️ SECURITY.md
+ ├─ 🛠️ pom.xml
+ └─ 📜 runMutationTests.sh""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
\ No newline at end of file
diff --git a/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/SortingTest.java b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/SortingTest.java
new file mode 100644
index 0000000..5e4c080
--- /dev/null
+++ b/jfiletreeprettyprinter-examples/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/SortingTest.java
@@ -0,0 +1,29 @@
+package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+class SortingTest {
+
+ @Test
+ void test() {
+ var result = Sorting.run();
+
+ var expected = """
+ sorting/
+ ├─ c_dir/
+ │ └─ c_file
+ ├─ d_dir/
+ │ ├─ d_b_dir/
+ │ │ └─ d_b_file
+ │ └─ d_a_file
+ ├─ a_file
+ ├─ b_file
+ ├─ x_file
+ └─ y_file""";
+
+ assertThat(result).isEqualTo(expected);
+ }
+
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 0504be2..4052263 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,40 +5,28 @@
io.github.computerdaddyguy
jfiletreeprettyprinter
- 0.1.1-SNAPSHOT
+ ${revision}
- jar
- JFileTreePrettyPrinter
- A lightweight and flexible Java library to pretty-print directory structures — ideal for documentation, project overviews, or CLI tools.
- https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter
+ pom
-
-
- The Apache License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
-
-
-
-
-
- Samuel SCHNEGG
- samuel.schnegg@gmail.com
-
-
-
-
- scm:git:git://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter.git
- scm:git:ssh://github.com:ComputerDaddyGuy/JFileTreePrettyPrinter.git
- https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter/tree/main
-
+
+ jfiletreeprettyprinter-core
+ jfiletreeprettyprinter-cli
+ jfiletreeprettyprinter-examples
+
+ 0.1.1
+
21
21
21
UTF-8
+ 3.0.0
+ 9.0.1.Final
+ 4.7.7
1.0.0
5.13.4
3.27.4
@@ -46,7 +34,6 @@
3.10.1
3.5.2
- 3.6.1
3.4.2
0.8.12
1.20.2
@@ -55,97 +42,127 @@
3.3.1
3.11.2
3.2.7
+ 0.11.1
+ 9.0.2
+ 1.7.3
+
+
+ computerdaddyguy
+ ComputerDaddyGuy_JFileTreePrettyPrinter
+ https://sonarcloud.io
+ false
-
-
- org.jspecify
- jspecify
- ${jspecify.version}
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit.version}
- test
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
+
+
+
+ org.jspecify
+ jspecify
+ ${jspecify.version}
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ ${junit.version}
+ test
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ tools.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+ tools.jackson.dataformat
+ jackson-dataformat-yaml
+ ${jackson.version}
+
+
+ org.hibernate.validator
+ hibernate-validator
+ ${hibernate-validator.version}
+
+
+ info.picocli
+ picocli
+ ${picocli.version}
+
+
+
-
-
-
- org.codehaus.mojo
- build-helper-maven-plugin
- ${build-helper-maven-plugin.version}
-
-
- add-example-source
- generate-sources
-
- add-test-source
-
-
-
- src/example/java
-
-
-
-
- add-example-resources
- generate-resources
-
- add-test-resource
-
-
-
-
- src/example/resources
-
-
-
-
-
-
+
+
+
+
+
+ io.github.git-commit-id
+ git-commit-id-maven-plugin
+ ${git-commit-id-maven-plugin.version}
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${java.version}
+ ${java.version}
+ UTF-8
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ ${jacoco-maven-plugin.version}
+
+
+
+ org.pitest
+ pitest-maven
+ ${pitest-maven.version}
+
+
+
+ org.codehaus.mojo
+ flatten-maven-plugin
+ ${flatten-maven-plugin.version}
+
+
+
+
-
- org.apache.maven.plugins
- maven-jar-plugin
- ${maven-jar-plugin.version}
-
-
- src/example/**
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${java.version}
- ${java.version}
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
+
org.jacoco
jacoco-maven-plugin
- ${jacoco-maven-plugin.version}
@@ -176,7 +193,6 @@
org.pitest
pitest-maven
- ${pitest-maven.version}
org.pitest
@@ -220,77 +236,5 @@
-
-
- release
-
-
-
- org.sonatype.central
- central-publishing-maven-plugin
- ${central-publishing-maven-plugin.version}
- true
-
- central
- true
- true
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
- ${maven-source-plugin.version}
-
-
- attach-sources
- verify
-
- jar-no-fork
-
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- ${maven-javadoc-plugin.version}
-
-
- attach-javadoc
-
- jar
-
-
-
-
- java
- none
-
-
-
- org.apache.maven.plugins
- maven-gpg-plugin
- ${maven-gpg-plugin.version}
-
-
- sign-artifacts
- verify
-
- sign
-
-
-
-
-
- --pinentry-mode
- loopback
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java b/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java
deleted file mode 100644
index d26ff72..0000000
--- a/src/example/java/io/github/computerdaddyguy/jfiletreeprettyprinter/example/ProjectStructure.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package io.github.computerdaddyguy.jfiletreeprettyprinter.example;
-
-import io.github.computerdaddyguy.jfiletreeprettyprinter.FileTreePrettyPrinter;
-import io.github.computerdaddyguy.jfiletreeprettyprinter.options.ChildLimits;
-import io.github.computerdaddyguy.jfiletreeprettyprinter.options.LineExtensions;
-import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers;
-import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathSorts;
-import java.nio.file.Path;
-import java.util.Comparator;
-import java.util.function.Function;
-
-public class ProjectStructure {
-
- public static void main(String[] args) {
-
- /*
- * ==========================================================================================
- *
- * Complete example code that pretty prints JFileTreePrettyPrint own project structure.
- * See the result in image at: https://github.com/ComputerDaddyGuy/JFileTreePrettyPrinter
- *
- * ==========================================================================================
- */
-
- /*
- * The folder to pretty print (= the JFileTreePrettyPrint project root)
- */
- var projectFolder = Path.of(".");
-
- /*
- * Filter for directories (visit and display only folders that pass this filter)
- */
- var dirFilter = PathMatchers.noneOf(
- // Exclude these folders from traversal
- PathMatchers.hasNameStartingWith("."),
- PathMatchers.hasRelativePathMatchingGlob(projectFolder, "src/example"),
- PathMatchers.hasRelativePathMatchingGlob(projectFolder, "src/test"),
- PathMatchers.hasRelativePathMatchingGlob(projectFolder, "target")
- );
-
- /*
- * Filter for files (display only files that pass this filter)
- * Note: files for which the parent folder does not match the directory filter
- * are obviously not displayed, even if they pass the file filter.
- */
- var fileFilter = PathMatchers.noneOf(
-
- // Hide files with names starting with "."
- PathMatchers.hasNameStartingWith(".")
- );
-
- /*
- * Limit the number of displayed children by directory: some content is not relevant and clutters the final result!
- */
- var childLimitFunction = ChildLimits.builder()
- // Hide all files under renderer and scanner packages
- .add(PathMatchers.hasAbsolutePathMatchingGlob("**/io/github/computerdaddyguy/jfiletreeprettyprinter/options"), 0)
- .add(PathMatchers.hasAbsolutePathMatchingGlob("**/io/github/computerdaddyguy/jfiletreeprettyprinter/renderer"), 0)
- .add(PathMatchers.hasAbsolutePathMatchingGlob("**/io/github/computerdaddyguy/jfiletreeprettyprinter/scanner"), 0)
- .add(PathMatchers.hasAbsolutePathMatchingGlob("**/io/github/computerdaddyguy/jfiletreeprettyprinter"), 4)
- .build();
-
- /*
- * Add some comments on a few files and directories
- */
- Function lineExtension = LineExtensions.builder()
- .add(PathMatchers.hasName("project-structure.png"), "\t// This image")
- .add(PathMatchers.hasName("FileTreePrettyPrinter.java"), "\t// Main entry point")
- .add(PathMatchers.hasName("README.md"), "\t\t// You're reading at this!")
- .addLineBreak(PathMatchers.hasRelativePathMatchingGlob(projectFolder, "src/main/java"))
- .build();
-
- /*
- * Sort all paths by directory first (with highest precedence),
- * then "FileTreePrettyPrinter.java" has precedence "-100".
- * All other files have default precedence "0", and are then sorted alphabetically by default.
- */
- Comparator pathComparator = PathSorts.builder()
- .addFirst(PathMatchers.isDirectory())
- .add(PathMatchers.hasName("FileTreePrettyPrinter.java"), -100) // Default precedence is "0"
- .build();
-
- /*
- * Build the final FileTreePrettyPrinter
- */
- var prettyPrinter = FileTreePrettyPrinter.builder()
- .customizeOptions(
- options -> options
- .withDefaultEmojis() // Use emojis!
- .withCompactDirectories(true) // Inline directory chains: "src/main/java/..."
- .filterDirectories(dirFilter)
- .filterFiles(fileFilter)
- .withChildLimit(childLimitFunction)
- .withLineExtension(lineExtension)
- .sort(pathComparator)
- )
- .build();
-
- /*
- * Pretty print and display the result!
- */
- var tree = prettyPrinter.prettyPrint(projectFolder);
- System.out.println(tree);
-
- /*
- ================================
- Expected result
- ================================
-
- 📂 JFileTreePrettyPrinter/
- ├─ 📂 assets/
- │ └─ 🖼️ project-structure.png // This image
- ├─ 📂 src/main/java/
- │ └─ 📂 io/github/computerdaddyguy/jfiletreeprettyprinter/
- │ ├─ 📂 options/
- │ │ └─ ...
- │ ├─ 📂 renderer/
- │ │ └─ ...
- │ ├─ 📂 scanner/
- │ │ └─ ...
- │ ├─ ☕ FileTreePrettyPrinter.java // Main entry point
- │ └─ ...
- ├─ 🆕 CHANGELOG.md
- ├─ 🤝 CONTRIBUTING.md
- ├─ ⚖️ LICENSE
- ├─ 📘 README.md // You're reading at this!
- ├─ 🗺️ ROADMAP.md
- ├─ 🛡️ SECURITY.md
- ├─ 🛠️ pom.xml
- ├─ 📝 release_process.md
- └─ 📜 runMutationTests.sh
-
-
- */
- }
-
-}
diff --git a/src/example/resources/emojis/code/docker-compose.yml b/src/example/resources/emojis/code/docker-compose.yml
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.c b/src/example/resources/emojis/code/lang/file.c
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.class b/src/example/resources/emojis/code/lang/file.class
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.cpp b/src/example/resources/emojis/code/lang/file.cpp
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.cs b/src/example/resources/emojis/code/lang/file.cs
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.css b/src/example/resources/emojis/code/lang/file.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.htm b/src/example/resources/emojis/code/lang/file.htm
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.html b/src/example/resources/emojis/code/lang/file.html
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.htmx b/src/example/resources/emojis/code/lang/file.htmx
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.jar b/src/example/resources/emojis/code/lang/file.jar
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.less b/src/example/resources/emojis/code/lang/file.less
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.php b/src/example/resources/emojis/code/lang/file.php
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.py b/src/example/resources/emojis/code/lang/file.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.scss b/src/example/resources/emojis/code/lang/file.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.sql b/src/example/resources/emojis/code/lang/file.sql
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/lang/file.ts b/src/example/resources/emojis/code/lang/file.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/scripting/file.bash b/src/example/resources/emojis/code/scripting/file.bash
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/scripting/file.bat b/src/example/resources/emojis/code/scripting/file.bat
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/code/scripting/file.sh b/src/example/resources/emojis/code/scripting/file.sh
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.cfg b/src/example/resources/emojis/data/file.cfg
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.conf b/src/example/resources/emojis/data/file.conf
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.csv b/src/example/resources/emojis/data/file.csv
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.json b/src/example/resources/emojis/data/file.json
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.ods b/src/example/resources/emojis/data/file.ods
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.properties b/src/example/resources/emojis/data/file.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.xls b/src/example/resources/emojis/data/file.xls
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.xml b/src/example/resources/emojis/data/file.xml
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.yaml b/src/example/resources/emojis/data/file.yaml
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/data/file.yml b/src/example/resources/emojis/data/file.yml
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/doc/file.doc b/src/example/resources/emojis/doc/file.doc
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/doc/file.epub b/src/example/resources/emojis/doc/file.epub
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/doc/file.md b/src/example/resources/emojis/doc/file.md
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/doc/file.odt b/src/example/resources/emojis/doc/file.odt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/doc/file.rtf b/src/example/resources/emojis/doc/file.rtf
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/doc/file.txt b/src/example/resources/emojis/doc/file.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/file.unknown_extension b/src/example/resources/emojis/file.unknown_extension
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/file_without_extension b/src/example/resources/emojis/file_without_extension
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/changelog b/src/example/resources/emojis/internet/github/changelog
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/changelog.md b/src/example/resources/emojis/internet/github/changelog.md
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/contributing b/src/example/resources/emojis/internet/github/contributing
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/contributing.md b/src/example/resources/emojis/internet/github/contributing.md
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/license b/src/example/resources/emojis/internet/github/license
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/license.md b/src/example/resources/emojis/internet/github/license.md
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/readme.md b/src/example/resources/emojis/internet/github/readme.md
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/roadmap b/src/example/resources/emojis/internet/github/roadmap
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/roadmap.md b/src/example/resources/emojis/internet/github/roadmap.md
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/security b/src/example/resources/emojis/internet/github/security
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/github/security.md b/src/example/resources/emojis/internet/github/security.md
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/internet/robots.txt b/src/example/resources/emojis/internet/robots.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/audio/file.aac b/src/example/resources/emojis/media/audio/file.aac
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/audio/file.flac b/src/example/resources/emojis/media/audio/file.flac
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/audio/file.midi b/src/example/resources/emojis/media/audio/file.midi
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/audio/file.ogg b/src/example/resources/emojis/media/audio/file.ogg
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/audio/file.wav b/src/example/resources/emojis/media/audio/file.wav
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/images/file.bmp b/src/example/resources/emojis/media/images/file.bmp
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/images/file.gif b/src/example/resources/emojis/media/images/file.gif
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/images/file.ico b/src/example/resources/emojis/media/images/file.ico
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/images/file.jpg b/src/example/resources/emojis/media/images/file.jpg
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/images/file.png b/src/example/resources/emojis/media/images/file.png
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/images/file.svg b/src/example/resources/emojis/media/images/file.svg
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/video/file.mkv b/src/example/resources/emojis/media/video/file.mkv
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/video/file.mov b/src/example/resources/emojis/media/video/file.mov
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/video/file.mp4 b/src/example/resources/emojis/media/video/file.mp4
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/video/file.webm b/src/example/resources/emojis/media/video/file.webm
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/media/video/file.wmv b/src/example/resources/emojis/media/video/file.wmv
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/system/file.bak b/src/example/resources/emojis/system/file.bak
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/system/file.crt b/src/example/resources/emojis/system/file.crt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/system/file.key b/src/example/resources/emojis/system/file.key
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/system/file.log b/src/example/resources/emojis/system/file.log
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/system/file.pem b/src/example/resources/emojis/system/file.pem
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/system/file.pub b/src/example/resources/emojis/system/file.pub
deleted file mode 100644
index e69de29..0000000
diff --git a/src/example/resources/emojis/system/file.tmp b/src/example/resources/emojis/system/file.tmp
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitStaticTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitStaticTest.java
deleted file mode 100644
index 66ebc5e..0000000
--- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/ChildLimitStaticTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package io.github.computerdaddyguy.jfiletreeprettyprinter;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructures;
-import java.nio.file.Path;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.io.TempDir;
-
-class ChildLimitStaticTest {
-
- @TempDir
- private Path root;
-
- private FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.withChildLimit(3))
- .build();
-
- @Test
- void nominal() {
- var path = FileStructures.emptyDirectory(root);
- var result = printer.prettyPrint(path);
- var expected = "targetPath/";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void dirWith_1_file() {
- var path = FileStructures.simpleDirectoryWithFiles(root, 1);
- var result = printer.prettyPrint(path);
- var expected = """
- targetPath/
- └─ file1""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void dirWith_limit_minus_one_files() {
- var path = FileStructures.simpleDirectoryWithFiles(root, 2);
- var result = printer.prettyPrint(path);
- var expected = """
- targetPath/
- ├─ file1
- └─ file2""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void dirWith_exact_limit_of_files() {
- var path = FileStructures.simpleDirectoryWithFiles(root, 3);
- var result = printer.prettyPrint(path);
- var expected = """
- targetPath/
- ├─ file1
- ├─ file2
- └─ file3""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void dirWith_1_extra_file() {
- var path = FileStructures.simpleDirectoryWithFiles(root, 4);
- var result = printer.prettyPrint(path);
- var expected = """
- targetPath/
- ├─ file1
- ├─ file2
- ├─ file3
- └─ ...""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void dirWith_2_extra_files() {
- var path = FileStructures.simpleDirectoryWithFiles(root, 5);
- var result = printer.prettyPrint(path);
- var expected = """
- targetPath/
- ├─ file1
- ├─ file2
- ├─ file3
- └─ ...""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void dirWith_2_extra_files_and_1_extra_folder() {
- var path = FileStructures.simpleDirectoryWithFilesAndFolders(root, 5, 1);
- var result = printer.prettyPrint(path);
- var expected = """
- targetPath/
- ├─ file1
- ├─ file2
- ├─ file3
- └─ ...""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void dirWith_2_extra_files_and_2_extra_folders() {
- var path = FileStructures.simpleDirectoryWithFilesAndFolders(root, 5, 2);
- var result = printer.prettyPrint(path);
- var expected = """
- targetPath/
- ├─ file1
- ├─ file2
- ├─ file3
- └─ ...""";
- assertThat(result).isEqualTo(expected);
- }
-
-}
diff --git a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java b/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java
deleted file mode 100644
index cbcf72e..0000000
--- a/src/test/java/io/github/computerdaddyguy/jfiletreeprettyprinter/FilteringTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-package io.github.computerdaddyguy.jfiletreeprettyprinter;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathMatchers;
-import io.github.computerdaddyguy.jfiletreeprettyprinter.options.PathSorts;
-import io.github.computerdaddyguy.jfiletreeprettyprinter.util.FileStructureCreator;
-import java.nio.file.Path;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.io.TempDir;
-
-class FilteringTest {
-
- @TempDir
- private Path root;
-
- @Test
- void example_file() {
-
- var filter = PathMatchers.hasExtension("java");
- FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.filterFiles(filter))
- .build();
-
- var result = printer.prettyPrint("src/example/resources/filtering");
- var expected = """
- filtering/
- ├─ dir_with_java_files/
- │ ├─ file_B.java
- │ └─ file_E.java
- ├─ dir_with_nested_java_files/
- │ ├─ nested_dir_with_java_files/
- │ │ ├─ file_G.java
- │ │ └─ file_J.java
- │ └─ nested_dir_with_no_java_file/
- ├─ dir_with_no_java_file/
- └─ file_A.java""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void example_dir() {
-
- var filter = PathMatchers.hasNameEndingWith("no_java_file");
- FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.filterDirectories(filter))
- .build();
-
- var result = printer.prettyPrint("src/example/resources/filtering");
- var expected = """
- filtering/
- ├─ dir_with_no_java_file/
- │ ├─ file_M.cpp
- │ └─ file_N.ts
- └─ file_A.java""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void example_and_sorting() {
-
- var filter = PathMatchers.hasExtension("java");
- FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.sort(PathSorts.ALPHABETICAL.reversed()))
- .customizeOptions(options -> options.filterFiles(filter))
- .build();
-
- var result = printer.prettyPrint("src/example/resources/filtering");
- var expected = """
- filtering/
- ├─ file_A.java
- ├─ dir_with_no_java_file/
- ├─ dir_with_nested_java_files/
- │ ├─ nested_dir_with_no_java_file/
- │ └─ nested_dir_with_java_files/
- │ ├─ file_J.java
- │ └─ file_G.java
- └─ dir_with_java_files/
- ├─ file_E.java
- └─ file_B.java""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void example_childLimit_1() {
-
- var filter = PathMatchers.hasExtension("java");
- FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.withChildLimit(1))
- .customizeOptions(options -> options.filterFiles(filter))
- .build();
-
- var result = printer.prettyPrint("src/example/resources/filtering");
- var expected = """
- filtering/
- ├─ dir_with_java_files/
- │ ├─ file_B.java
- │ └─ ...
- └─ ...""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void example_childLimit_2() {
-
- var filter = PathMatchers.hasExtension("java");
- FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.withChildLimit(2))
- .customizeOptions(options -> options.filterFiles(filter))
- .build();
-
- var result = printer.prettyPrint("src/example/resources/filtering");
- var expected = """
- filtering/
- ├─ dir_with_java_files/
- │ ├─ file_B.java
- │ └─ file_E.java
- ├─ dir_with_nested_java_files/
- │ ├─ nested_dir_with_java_files/
- │ │ ├─ file_G.java
- │ │ └─ file_J.java
- │ └─ nested_dir_with_no_java_file/
- └─ ...""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void example_childLimit_3() {
-
- var filter = PathMatchers.hasExtension("java");
- FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.withChildLimit(3))
- .customizeOptions(options -> options.filterFiles(filter))
- .build();
-
- var result = printer.prettyPrint("src/example/resources/filtering");
- var expected = """
- filtering/
- ├─ dir_with_java_files/
- │ ├─ file_B.java
- │ └─ file_E.java
- ├─ dir_with_nested_java_files/
- │ ├─ nested_dir_with_java_files/
- │ │ ├─ file_G.java
- │ │ └─ file_J.java
- │ └─ nested_dir_with_no_java_file/
- ├─ dir_with_no_java_file/
- └─ ...""";
- assertThat(result).isEqualTo(expected);
- }
-
- @Test
- void example_compact_dir() {
-
- // @formatter:off
- var path = FileStructureCreator
- .forTargetPath(root)
- .createAndEnterDirectory("level1")
- .createAndEnterDirectory("level2-1")
- .createAndEnterDirectory("level3-1")
- .createAndEnterDirectory("level4-1")
- .createFiles("file4-1#", 3)
- .up() // level4
- .createAndEnterDirectory("level4-2")
- .createFiles("file4-2#", 3)
- .up() // level4
- .up() // level3
- .up() // level2
- .up() // level1
- .getPath();
- // @formatter:on
-
- var dirFilter = PathMatchers.hasNameEndingWith("1");
- var fileFilter = PathMatchers.hasExtension("java");
- FileTreePrettyPrinter printer = FileTreePrettyPrinter.builder()
- .customizeOptions(options -> options.withCompactDirectories(true))
- .customizeOptions(options -> options.filterDirectories(dirFilter))
- .customizeOptions(options -> options.filterFiles(fileFilter))
- .build();
-
- var result = printer.prettyPrint(path);
- var expected = """
- targetPath/
- └─ level1/level2-1/level3-1/level4-1/""";
- assertThat(result).isEqualTo(expected);
- }
-
-}