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 @@ [![Javadoc](https://javadoc.io/badge2/io.github.computerdaddyguy/jfiletreeprettyprinter/javadoc.svg?color=blue)](https://javadoc.io/doc/io.github.computerdaddyguy/jfiletreeprettyprinter) [![Apache License 2.0](https://img.shields.io/:license-Apache%20License%202.0-blue.svg)](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.

- JFileTreePrettyPrint project structure, using JFileTreePrettyPrint + JFileTreePrettyPrint project structure, using JFileTreePrettyPrint

-> [!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); - } - -}