{"id":15683615,"url":"https://github.com/dgroup/term4j","last_synced_at":"2025-05-07T13:46:54.600Z","repository":{"id":34294441,"uuid":"166624430","full_name":"dgroup/term4j","owner":"dgroup","description":"Simplify manipulations with CLI terminal(s) for Java-based applications","archived":false,"fork":false,"pushed_at":"2022-03-10T16:39:53.000Z","size":186,"stargazers_count":10,"open_issues_count":12,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-31T10:42:33.519Z","etag":null,"topics":["cli","console","elegantobjects","hamcrest","hamcrest-matchers","java","lightweight","oop","oop-principles","simple","terminal"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dgroup.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-20T04:51:20.000Z","updated_at":"2023-03-10T11:38:49.000Z","dependencies_parsed_at":"2022-08-08T00:15:36.932Z","dependency_job_id":null,"html_url":"https://github.com/dgroup/term4j","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dgroup%2Fterm4j","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dgroup%2Fterm4j/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dgroup%2Fterm4j/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dgroup%2Fterm4j/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dgroup","download_url":"https://codeload.github.com/dgroup/term4j/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252890206,"owners_count":21820343,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","console","elegantobjects","hamcrest","hamcrest-matchers","java","lightweight","oop","oop-principles","simple","terminal"],"created_at":"2024-10-03T17:07:44.633Z","updated_at":"2025-05-07T13:46:54.557Z","avatar_url":"https://github.com/dgroup.png","language":"Java","readme":"[![Maven](https://img.shields.io/maven-central/v/io.github.dgroup/term4j.svg)](https://mvnrepository.com/artifact/io.github.dgroup/term4j)\n[![Javadocs](http://www.javadoc.io/badge/io.github.dgroup/term4j.svg)](http://www.javadoc.io/doc/io.github.dgroup/term4j)\n[![License: MIT](https://img.shields.io/github/license/mashape/apistatus.svg)](./license.txt)\n[![Commit activity](https://img.shields.io/github/commit-activity/y/dgroup/term4j.svg?style=flat-square)](https://github.com/dgroup/term4j/graphs/commit-activity)\n[![Hits-of-Code](https://hitsofcode.com/github/dgroup/term4j)](https://hitsofcode.com/view/github/dgroup/term4j)\n\n[![Build Status](https://travis-ci.org/dgroup/term4j.svg?branch=master\u0026style=for-the-badge)](https://travis-ci.org/dgroup/term4j)\n[![0pdd](http://www.0pdd.com/svg?name=dgroup/term4j)](http://www.0pdd.com/p?name=dgroup/term4j)\n[![Dependency Status](https://requires.io/github/dgroup/term4j/requirements.svg?branch=master)](https://requires.io/github/dgroup/term4j/requirements/?branch=master)\n[![Known Vulnerabilities](https://snyk.io/test/github/dgroup/term4j/badge.svg)](https://snyk.io/org/dgroup/project/58b731a9-6b07-4ccf-9044-ad305ad243e6/?tab=dependencies\u0026vulns=vulnerable)\n\n[![DevOps By Rultor.com](http://www.rultor.com/b/dgroup/term4j)](http://www.rultor.com/p/dgroup/term4j)\n[![EO badge](http://www.elegantobjects.org/badge.svg)](http://www.elegantobjects.org/#principles)\n[![We recommend IntelliJ IDEA](http://www.elegantobjects.org/intellij-idea.svg)](https://www.jetbrains.com/idea/)\n\n[![Qulice](https://img.shields.io/badge/qulice-passed-blue.svg)](http://www.qulice.com/)\n[![SQ maintainability](https://sonarcloud.io/api/project_badges/measure?project=io.github.dgroup%3Aterm4j\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=io.github.dgroup%3Aterm4j)\n[![Codebeat](https://codebeat.co/badges/f61cb4a4-660f-4149-bbc6-8b66fec90941)](https://codebeat.co/projects/github-com-dgroup-term4j-master)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/e72eb423424b4b6db9ba64aa97463206)](https://www.codacy.com/app/dgroup/term4j?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=dgroup/term4j\u0026amp;utm_campaign=Badge_Grade)\n[![Codecov](https://codecov.io/gh/dgroup/term4j/branch/master/graph/badge.svg?token=Pqdeao3teI)](https://codecov.io/gh/dgroup/term4j)\n\n## What it is\n**term4j** is an object-oriented primitives to simplify the manipulations with CLI terminal(s) for Java-based applications.\n\n## Principles\n[Design principles](http://www.elegantobjects.org#principles) behind term4j.\n\n## How to use\nGet the latest version [here](https://github.com/dgroup/term4j/releases):\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.dgroup\u003c/groupId\u003e\n    \u003cartifactId\u003eterm4j\u003c/artifactId\u003e\n    \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nJava version required: 1.8+.\n\nInterface                   | Purpose                                                               | Implementations / Related\n----------------------------|-----------------------------------------------------------------------|-------------------------------------------------\n[Arg\\\u003cT\u003e](#argt)            | Allows to fetch the application arguments                             | [StringOf](#stringof--textof), [NumberOf](#numberof), [PathOf](), [FileOf](), [EnvOf](#envof), [PropOf](#propof), [Alt](#alt), [Unchecked](), [etc](src/main/java/io/github/dgroup/term4j/arg/) |\n[Input](#stdin)             | Wrap the raw manipulation with `std in`                              | [StdOf](#stdof), [Inmem](), [etc](src/main/java/io/github/dgroup/term4j/std)\n[Output](#stdout)           | Wrap the raw manipulation with `std out`                              | [StdOf](#stdof), [Inmem](), [etc](src/main/java/io/github/dgroup/term4j/std)\n[Highlighted](#highlighted) | The colored extension of [Text](https://goo.gl/2ZYC83) for `std out`  | [Green](src/main/java/io/github/dgroup/term4j/highlighted/Green.java), [Red](src/main/java/io/github/dgroup/term4j/highlighted/Red.java), [Yellow](src/main/java/io/github/dgroup/term4j/highlighted/Yellow.java), [etc](src/main/java/io/github/dgroup/term4j/highlighted)\n[Runtime](#runtimeof)       | Wrap the raw manipulation with JVM runtime                            | [RuntimeOf](src/main/java/io/github/dgroup/term4j/runtime/RuntimeOf.java), [FakeRuntime](src/main/java/io/github/dgroup/term4j/runtime/FakeRuntime.java), [AppException](src/main/java/io/github/dgroup/term4j/runtime/AppException.java), [Stacktrace](src/main/java/io/github/dgroup/term4j/runtime/Stacktrace.java), [etc](src/main/java/io/github/dgroup/term4j/runtime)\n\nAll examples below are using the following frameworks/libs:\n - [Hamcrest](https://github.com/hamcrest/JavaHamcrest) - Library of matchers, which can be combined in to create flexible expressions of intent in tests.\n - [cactoos](https://github.com/yegor256/cactoos) - Object-Oriented Java primitives, as an alternative to Google Guava and Apache Commons.\n - [cactoos-matchers](https://github.com/yegor256/cactoos) - Object-Oriented Hamcrest matchers\n\n### [Arg\\\u003cT\u003e](src/main/java/io/github/dgroup/term4j/arg/Arg.java)\n#### [StringOf](src/main/java/io/github/dgroup/term4j/arg/StringOf.java) / [TextOf](src/main/java/io/github/dgroup/term4j/arg/TextOf.java)\nFetch the string/[Text](https://goo.gl/2ZYC83) argument:\n```bash\n$ java -jar app.jar --key vOIkv7mzQV2UkV1\n```\n```java\npublic static void main(String[] cargs) {\n    final List\u003cString\u003e args = new ListOf\u003c\u003e(cargs);\n    MatcherAssert.assertThat(\n        \"The argument '--key' has value 'vOIkv7mzQV2UkV1'\",\n        new StringOf(\"--key\", args),\n        new ArgHas\u003c\u003e(\"vOIkv7mzQV2UkV1\")\n    );\n    // or\n    final Arg\u003cString\u003e key = new StringOf(\"--key\", args);\n}\n```\n#### [NumberOf](src/main/java/io/github/dgroup/term4j/arg/NumberOf.java)\nFetch the numeric argument:\n```bash\n$ java -jar app.jar -t 10\n```\n```java\npublic static void main(String[] cargs) throws ArgNotFoundException {\n    final List\u003cString\u003e args = new ListOf\u003c\u003e(cargs);\n    MatcherAssert.assertThat(\n        \"The argument '-t' has value '10'\",\n        new NumberOf(\"-t\", args).toInt(),\n        new IsEqual\u003c\u003e(10)\n    );\n    // or\n    final int threads = new NumberOf(\"-t\", args).toInt();\n}\n```\n#### [PathOf](src/main/java/io/github/dgroup/term4j/arg/PathOf.java) / [FileOf](src/main/java/io/github/dgroup/term4j/arg/FileOf.java)\nFetch the argument as a `java.nio.file.Path` or `java.io.File`:\n```bash\n$ java -jar app.jar -f ./readme.md\n```\n```java\npublic static void main(String[] cargs) throws ArgNotFoundException {\n    final List\u003cString\u003e args = new ListOf\u003c\u003e(cargs);\n    MatcherAssert.assertThat(\n        \"The argument '-f' has path './readme.md'\",\n        new PathOf(\"-f\", args),\n        new ArgHas\u003c\u003e(Paths.get(\".\", \"readme.md\"))\n    );\n    // or\n    final Arg\u003cPath\u003e src = new PathOf(\"-f\", args);\n}\n```\n#### [EnvOf](src/main/java/io/github/dgroup/term4j/arg/EnvOf.java)\nFetch the environment variable:\n```bash\n$ echo $JAVA_HOME\n/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home\n```\n```java\npublic static void main(String[] cargs) throws ArgNotFoundException {\n    final List\u003cString\u003e args = new ListOf\u003c\u003e(cargs);\n    MatcherAssert.assertThat(\n        \"The environment variable 'JAVA_HOME' has 1.8.0_181\",\n        new EnvOf(\"JAVA_HOME\").value(),\n        new StringContains(\"1.8.0_181\")\n    );\n    // or\n    final Arg\u003cString\u003e jhome = new EnvOf(\"JAVA_HOME\");\n}\n```\n#### [PropOf](src/main/java/io/github/dgroup/term4j/arg/PropOf.java)\nFetch the application property:\n```bash\n$ java -Dlevel=debug -jar app.jar\n```\n```java\npublic static void main(String[] cargs) throws ArgNotFoundException {\n    final List\u003cString\u003e args = new ListOf\u003c\u003e(cargs);\n    MatcherAssert.assertThat(\n        \"The application property 'level' is 'debug'\",\n        new PropOf(\"level\"),\n        new ArgHas\u003c\u003e(\"debug\")\n    );\n    // or\n    final Arg\u003cString\u003e verbose = new PropOf(\"level\");\n}\n```\n#### [Alt](src/main/java/io/github/dgroup/term4j/arg/Alt.java)\nThe alternative value in case if the argument wasn't specified:\n```bash\n$ java -jar app.jar\n```\n```java\npublic static void main(String[] cargs) {\n    final List\u003cString\u003e args = new ListOf\u003c\u003e(cargs);\n    MatcherAssert.assertThat(\n        \"The argument '--key' is using default value 'vOIkv7mzQV2UkV1'\",\n        new Alt(\n            new StringOf(\"--key\", args),\n            \"vOIkv7mzQV2UkV1\"\n        ),\n        new ArgHas\u003c\u003e(\"vOIkv7mzQV2UkV1\")\n    );\n    // or\n    final Arg\u003cString\u003e key = new Alt(\n        new StringOf(\"--key\", args), \"vOIkv7mzQV2UkV1\"\n    );\n}\n```\n### [Input](src/main/java/io/github/dgroup/term4j/std/input/Input.java)\n#### [Stdin](src/main/java/io/github/dgroup/term4j/std/input/Stdin.java)\nWrap the std out, for example for unit testing purposes:\n```java\n    /**\n     * Simulate the STD input procedure.\n     */\n    @Test\n    public void readFromStdin() {\n        /**\n         * The standard system input (stdin) which keeps the expected input lines in-memory\n         *  instead of direct manipulations with {@link System#in} or {@link Console}.\n         */\n        final Input stdin = new Stdin(\n            new InputOf(String.format(\"line1%nline2\"))\n        );\n        MatcherAssert.assertThat(\n            \"The 1st line was read from console\",\n            stdin.value(),\n            new IsEqual(\"line1\")\n        );\n        MatcherAssert.assertThat(\n            \"The 2nd line was read from console\",\n            stdin.value(),\n            new IsEqual(\"line2\")\n        );\n    }\n```\n\n### [Output](src/main/java/io/github/dgroup/term4j/std/output/Output.java)\n#### [Stdout](src/main/java/io/github/dgroup/term4j/std/output/Stdout.java)\nWrap the std out, for example for unit testing purposes:\n```java\n    /**\n     * Simulate the STD print procedure using {@link StringWriter}.\n     */\n    @Test\n    public void printToWriter() {\n        // Write 4 lines delimited by `\\n` or `\\r\\n` to the StringWriter\n        final StringWriter swter = new StringWriter();\n        final Output std = new Stdout(swter);\n        std.print(\"line1\", \"line2\");\n        std.print(\"line3\", \"line4\");\n        // Check that the result string has 4 lines\n        MatcherAssert.assertThat(\n            \"4 lines of text were printed to the output\",\n            swter.toString(),\n            new HasLines(\"line1\", \"line2\", \"line3\", \"line4\")\n        );\n    }\n```\n### [Highlighted](src/main/java/io/github/dgroup/term4j/Highlighted.java)\n### [Green](src/main/java/io/github/dgroup/term4j/highlighted/Green.java) / [Red](src/main/java/io/github/dgroup/term4j/highlighted/Red.java)\nPrint colored text to the `std out`:\n```java\npublic static void main(String[] cargs) {\n    System.out.printf(\n        \"%n Status: [%s|%s] %n\", new Green(\"Passed\"), new Red(\"Failed\")\n    );\n}\n```\n\u003cimg src=\".docs/highlighted-red-green.png\" height=40% width=40% alt='Colored message'/\u003e\n\nSee [more](src/main/java/io/github/dgroup/term4j/highlighted/).\n### RuntimeOf\nExit from application using particular exit code:\n```java\npublic static void main(String[] cargs) {\n    try {\n        // application exception happens\n    } catch (final AppException cause) {\n        new RuntimeOf().shutdownWith(\n            cause.exitCode()\n        );\n    }\n}\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdgroup%2Fterm4j","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdgroup%2Fterm4j","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdgroup%2Fterm4j/lists"}