{"id":13503057,"url":"https://github.com/iqlusioninc/abscissa","last_synced_at":"2025-05-13T16:18:35.684Z","repository":{"id":32917441,"uuid":"146150191","full_name":"iqlusioninc/abscissa","owner":"iqlusioninc","description":"Application microframework with command-line option parsing, configuration, error handling, logging, and shell interactions","archived":false,"fork":false,"pushed_at":"2025-03-27T13:52:37.000Z","size":1278,"stargazers_count":579,"open_issues_count":41,"forks_count":40,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-03-27T21:48:09.791Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iqlusioninc.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-26T04:07:00.000Z","updated_at":"2025-03-06T21:21:04.000Z","dependencies_parsed_at":"2024-01-13T19:22:23.707Z","dependency_job_id":"b689d91c-c505-4815-8c73-ee806f00d41f","html_url":"https://github.com/iqlusioninc/abscissa","commit_stats":{"total_commits":398,"total_committers":18,"mean_commits":22.11111111111111,"dds":0.4824120603015075,"last_synced_commit":"8ae26ec1abf57a79f4eb3871993cecb3ca86e240"},"previous_names":[],"tags_count":78,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iqlusioninc%2Fabscissa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iqlusioninc%2Fabscissa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iqlusioninc%2Fabscissa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iqlusioninc%2Fabscissa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iqlusioninc","download_url":"https://codeload.github.com/iqlusioninc/abscissa/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246190181,"owners_count":20737987,"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":[],"created_at":"2024-07-31T22:02:35.115Z","updated_at":"2025-03-29T13:30:38.049Z","avatar_url":"https://github.com/iqlusioninc.png","language":"Rust","funding_links":[],"categories":["Rust","Other"],"sub_categories":[],"readme":"# ![Abscissa][logo]\n\n[![Crate][crate-image]][crate-link]\n[![Docs][docs-image]][docs-link]\n[![Apache 2.0 Licensed][license-image]][license-link]\n![MSRV][rustc-image]\n[![Safety Dance][safety-image]][safety-link]\n[![Build Status][build-image]][build-link]\n\nAbscissa is a microframework for building Rust applications (either CLI tools\nor network/web services), aiming to provide a large number of features with a\n*minimal number of dependencies*, and with a *strong focus on security*.\n\n[Documentation][docs-link]\n\n## Features\n\n- **command-line option parsing**: simple declarative option parser based on\n  [clap]. The option parser in Abcissa contains numerous improvements which\n  provide better UX and tighter integration with the other parts of the\n  framework (e.g. overriding configuration settings using command-line options).\n- **components**: Abscissa uses a component architecture (similar to an ECS)\n  for extensibility/composability, with a minimalist implementation that still\n  provides such features such as calculating dependency ordering and providing\n  hooks into the application lifecycle. Newly generated apps use two components\n  by default: `terminal` and `logging`.\n- **configuration**: Simple parsing of TOML configurations to `serde`-parsed\n  configuration types which can be dynamically updated at runtime.\n- **error handling**: unified error-handling subsystem with generic error type.\n- **logging**: based on the `log` to provide application-level logging.\n- **secrets management**: the (optional) `secrets` module includes a `Secret`\n  type which derives serde's `Deserialize` and can be used to represent secret\n  values parsed from configuration files or elsewhere (e.g. credentials loaded\n  from the environment or network requests)\n- **terminal interactions**: support for colored terminal output (with color\n  support autodetection). Useful for Cargo-like status messages with\n  easy-to-use macros.\n\n## Projects Using Abscissa\n\n- [Canister]: deployment utility for \"distroless\" containers/microVMs\n- [cargo-audit]: audit Cargo projects for security vulnerabilities\n- [cosmon]: observability tool for Tendermint applications\n- [ibc-rs]: Rust implementation of Interblockchain Communication (IBC) modules and relayer\n- [rustic]: fast, encrypted, and deduplicated backups\n- [Synchronicity]: distributed build system providing BFT proofs-of-reproducibility\n- [Tendermint KMS]: key management system for Tendermint applications\n- [Zebra]: Rust implementation of a Zcash node\n- [Zerostash]: Encrypted and deduplicated backups\n\n\n## Crate Structure\n\nAbscissa presently consists of three crates:\n\n- [abscissa]: CLI app and application generator - `cargo install abscissa`\n- [abscissa_core]: main framework library\n- [abscissa_derive]: custom derive support - implementation detail of `abscissa_core`\n- [abscissa_tokio]: support for launching Tokio runtimes within Abscissa applications\n\n## Minimum Supported Rust Version\n\nRequires Rust **1.74** or newer.\n\n## Installation\n\nTo generate a new Abscissa application, install the `abscissa` CLI utility:\n\n```text\n$ cargo install abscissa\n```\n\n## Creating a new Abscissa application\n\nThe following commands will generate an Abscissa application skeleton:\n\n```text\n$ cargo install abscissa\n$ abscissa new my_cool_app\n```\n\nThe resulting app is a Cargo project. The following files are particularly\nnoteworthy:\n\n- `src/application.rs`: Abscissa application type for your app\n- `src/commands*`: application entrypoint and subcommands. Make sure to\n  check out the `start.rs` example of how to make a subcommand.\n- `src/config.rs`: application configuration\n- `src/error.rs`: error types\n\nAbscissa applications are implemented as Rust libraries, but have a\n`src/bin` subdirectory where the binary entrypoint lives. This means you\ncan run the following within your newly generated application:\n\n```text\n$ cargo run -- start world\n```\n\nThis will invoke the `start` subcommand of your application (you\nmight want to rename that in your app) which will print the following:\n\n```text\nHello, world!\n```\n\nYou can also run the following to print basic help information:\n\n```text\n$ cargo run -- --help\n ```\n\n## Status Macros\n\n```text\n// Print a Cargo-like justified status to STDOUT\nstatus_ok!(\"Loaded\", \"app loaded successfully\");\n\n// Print an error message\nstatus_err!(\"something bad happened\");\n\n// Print an indented attribute to STDOUT\nstatus_attr_ok!(\"good\", \"yep\");\n\n// Print an error attribute to STDERR\nstatus_attr_err!(\"error\", \"yep\");\n```\n\n## Frequently Asked Questions (FAQ)\n\n#### Q1: Why is it called \"abscissa\"?\n\n**A1:** The word \"abscissa\" is the key to the [Kryptos K2] panel.\n\n#### Q2: \"Abscissa\" is a hard name to remember! Got any tips?\n\n**A2**: Imagine you're A-B testing a couple of scissors... with attitude.\n\n## Testing Framework Changes\n\nThe main way to test framework changes is by generating an application with\nAbscissa's built-in application generator and running tests against the\ngenerated application (also rustfmt, clippy).\n\nTo generate a test application and test it automatically, you can simply do:\n\n```text\n$ cargo test\n```\n\nHowever, when debugging test failures against a generated app, it's helpful to\nknow how to drive the app generation and testing process manually. Below are\ninstructions on how to do so.\n\nIf you've already run:\n\n```text\n$ git clone https://github.com/iqlusioninc/abscissa/\n```\n\n...and are inside the `abscissa` directory and want to test your changes,\nyou can generate an application by running the following command:\n\n```text\n$ cargo run -- new /tmp/example_app --patch-crates-io='abscissa = { path = \"$PWD\" }'\n```\n\nThis will generate a new Abscissa application in `/tmp/example_app` which\nreferences your local copy of Abscissa.\n\nAfter that, change directory to the newly generated app and run the tests\nto ensure things are still working (the tests, along with rustfmt and clippy\nare run as part of the CI process):\n\n```text\n$ cd /tmp/example_app # or 'pushd /tmp/example_app' and 'popd' to return\n$ cargo test\n$ cargo fmt -- --check # generated app is expected to pass rustfmt\n$ cargo clippy\n```\n\n## Code of Conduct\n\nWe abide by the [Contributor Covenant][cc] and ask that you do as well.\n\nFor more information, please see [CODE_OF_CONDUCT.md].\n\n## License\n\nThe **abscissa** crate is distributed under the terms of the\nApache License (Version 2.0).\n\nCopyright © 2018-2024 iqlusion\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n\u003chttps://www.apache.org/licenses/LICENSE-2.0\u003e\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n## Contribution\n\nIf you are interested in contributing to this repository, please make sure to\nread the [CONTRIBUTING.md] and [CODE_OF_CONDUCT.md] files first.\n\n[//]: # (badges)\n\n[logo]: https://raw.githubusercontent.com/iqlusioninc/abscissa/main/img/abscissa.svg\n[crate-image]: https://img.shields.io/crates/v/abscissa_core.svg?logo=rust\n[crate-link]: https://crates.io/crates/abscissa_core\n[docs-image]: https://docs.rs/abscissa_core/badge.svg\n[docs-link]: https://docs.rs/abscissa_core/\n[license-image]: https://img.shields.io/badge/license-Apache2.0-blue.svg\n[license-link]: https://github.com/iqlusioninc/abscissa/blob/main/LICENSE\n[rustc-image]: https://img.shields.io/badge/rustc-1.74+-blue.svg\n[safety-image]: https://img.shields.io/badge/unsafe-forbidden-success.svg\n[safety-link]: https://github.com/rust-secure-code/safety-dance/\n[build-image]: https://github.com/iqlusioninc/abscissa/workflows/cli/badge.svg?branch=main\u0026event=push\n[build-link]: https://github.com/iqlusioninc/abscissa/actions\n\n[//]: # (crate links)\n\n[abscissa]: https://crates.io/crates/abscissa\n[abscissa_core]: https://crates.io/crates/abscissa_core\n[abscissa_derive]: https://crates.io/crates/abscissa_derive\n[abscissa_tokio]: https://crates.io/crates/abscissa_tokio\n\n[//]: # (general links)\n\n[cargo]: https://github.com/rust-lang/cargo\n[cargo features]: https://doc.rust-lang.org/cargo/reference/manifest.html#the-features-section\n[Kryptos K2]: https://en.wikipedia.org/wiki/Kryptos#Solution_of_passage_2\n[cc]: https://contributor-covenant.org\n[CODE_OF_CONDUCT.md]: https://github.com/iqlusioninc/abscissa/blob/main/CODE_OF_CONDUCT.md\n[CONTRIBUTING.md]: https://github.com/iqlusioninc/abscissa/blob/main/CONTRIBUTING.md\n\n[//]: # (projects using abscissa)\n\n[Tendermint KMS]: https://github.com/iqlusioninc/tmkms\n[Canister]: https://github.com/iqlusioninc/canister\n[cargo-audit]: https://github.com/rustsec/cargo-audit\n[cosmon]: https://github.com/iqlusioninc/cosmon\n[ibc-rs]: https://github.com/informalsystems/ibc-rs\n[rustic]: https://github.com/rustic-rs/rustic\n[Synchronicity]: https://github.com/iqlusioninc/synchronicity\n[Zebra]: https://github.com/ZcashFoundation/zebra\n[Zerostash]: https://github.com/rsdy/zerostash\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiqlusioninc%2Fabscissa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiqlusioninc%2Fabscissa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiqlusioninc%2Fabscissa/lists"}