This commit is contained in:
		
							
								
								
									
										114
									
								
								content/posts/falyx.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								content/posts/falyx.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | |||||||
|  | --- | ||||||
|  | author: "Roland Thomas Jr" | ||||||
|  | title: "Falyx" | ||||||
|  | date: "2025-04-15" | ||||||
|  | description: "" | ||||||
|  | tags: ["post", "falyx", "cli"] | ||||||
|  | ShowToc: false | ||||||
|  | ShowBreadCrumbs: true | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | ## 🛡️ Introducing Falyx: A Resilient CLI Framework for Modern Workflows | ||||||
|  | In the ever-evolving landscape of software development, tools that offer resilience, clarity, and introspection are invaluable.   | ||||||
|  |  | ||||||
|  | Enter **Falyx**—a robust, asynchronous command-line interface (CLI) framework designed to streamline and fortify your workflows.   | ||||||
|  |  | ||||||
|  | ### ⚙️ What is Falyx? | ||||||
|  | Falyx is a Python-based CLI framework that empowers developers to build **modular**, **fault-tolerant** command-line applications. Inspired by the discipline and strength of a phalanx, Falyx ensures that each component of your workflow stands firm — even in the face of failure. | ||||||
|  |  | ||||||
|  | ### 🚀 Key Features | ||||||
|  |  | ||||||
|  | - **Modular Action Chaining** Compose complex workflows by chaining together discrete actions, each with its own context and lifecycle. | ||||||
|  | - **Built-in Retry Mechanism** – Handle flaky or transient failures with configurable retry policies, including exponential backoff. | ||||||
|  | - **Lifecycle Hooks** – Inject logic at every stage: `before`, `after`, `on_success`, `on_error`, and `on_teardown`. | ||||||
|  | - **Execution Tracing** – Built-in logging, result tracking, and timing for complete visibility. | ||||||
|  | - **Async-First Design** – Built on `asyncio`, with optional multiprocessing via `ProcessAction`. | ||||||
|  | - **Extensible CLI Menus** – Create interactive or headless menus using `prompt_toolkit` and `rich`, with support for history, tags, toggle states, and more. | ||||||
|  |  | ||||||
|  | ### 🧪 Getting Started | ||||||
|  |  | ||||||
|  | Here's a simple example to illustrate how Falyx can be used to build a resilient CLI application: | ||||||
|  |  | ||||||
|  | ```python | ||||||
|  | import asyncio | ||||||
|  | import random | ||||||
|  | from falyx import Falyx, Action, ChainedAction | ||||||
|  |  | ||||||
|  | # Define a flaky asynchronous step | ||||||
|  | async def flaky_step(): | ||||||
|  |     await asyncio.sleep(0.2) | ||||||
|  |     if random.random() < 0.5: | ||||||
|  |         raise RuntimeError("Random failure!") | ||||||
|  |     return "ok" | ||||||
|  |  | ||||||
|  | # Create actions with retry enabled | ||||||
|  | step1 = Action(name="step_1", action=flaky_step, retry=True) | ||||||
|  | step2 = Action(name="step_2", action=flaky_step, retry=True) | ||||||
|  |  | ||||||
|  | # Chain the actions together | ||||||
|  | chain = ChainedAction(name="my_pipeline", actions=[step1, step2]) | ||||||
|  |  | ||||||
|  | # Set up the CLI menu | ||||||
|  | falyx = Falyx("🚀 Falyx Demo") | ||||||
|  | falyx.add_command( | ||||||
|  |     key="R", | ||||||
|  |     description="Run My Pipeline", | ||||||
|  |     action=chain, | ||||||
|  |     logging_hooks=True, | ||||||
|  |     preview_before_confirm=True, | ||||||
|  |     confirm=True, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | # Entry point | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     asyncio.run(falyx.run()) | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | When run, this script presents an interactive CLI menu with built-in preview, confirmation, and retry handling. | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | ❯ python simple.py | ||||||
|  |                                 🚀 Falyx Demo | ||||||
|  |  | ||||||
|  |   [R] Run My Pipeline | ||||||
|  |   [Y] History                                         [Q] Exit | ||||||
|  |  | ||||||
|  | > | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Or run headlessly using intuitive CLI arguments: | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | ❯ python simple.py run R | ||||||
|  | Command: 'R' — Run My Pipeline | ||||||
|  | └── ⛓ ChainedAction 'my_pipeline' | ||||||
|  |     ├── ⚙ Action 'step_1' | ||||||
|  |     │   ↻ Retries: 3x, delay 1.0s, backoff 2.0x | ||||||
|  |     └── ⚙ Action 'step_2' | ||||||
|  |         ↻ Retries: 3x, delay 1.0s, backoff 2.0x | ||||||
|  | Confirm execution of R — Run My Pipeline (calls `my_pipeline`)  [Y/n] y | ||||||
|  | [2025-04-15 22:03:57] WARNING   ⚠️ Retry attempt 1/3 failed due to 'Random failure!'. | ||||||
|  | ✅ Result: ['ok', 'ok'] | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### 📈 Real-World Applications | ||||||
|  |  | ||||||
|  | Falyx is particularly well-suited for: | ||||||
|  |  | ||||||
|  | - **Automation Script**: Build resilient tools that self-heal from transient errors. | ||||||
|  | - **Data Pipelines**: Orchestrate complex data flows with retry logic and full observability. | ||||||
|  | - **Deployment Tooling**: Create safe deploys with preview, rollback, and confirmation baked in. | ||||||
|  |  | ||||||
|  | ### 📚 Learn More | ||||||
|  |  | ||||||
|  | - 📖 [Source Code on GitHub](https://github.com/rolandtjr/falyx) | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | Falyx was designed for developers who don’t just want CLI tools to **run** — they want them to **recover**, **report**, and **adapt**. | ||||||
|  |  | ||||||
|  | If that sounds like you, give it a spin and start building resilient command flows today. | ||||||
|  |  | ||||||
|  | > _"Like a phalanx: organized, resilient, and reliable."_ ⚔️ | ||||||
|  |  | ||||||
|  | --- | ||||||
		Reference in New Issue
	
	Block a user