Sign inSign up

aniondocker/conduit-cli

By aniondocker

•Updated 11 months ago

Streaming, declarative pipelined data processing library for Python

Image
0

465

aniondocker/conduit-cli repository overview

⁠Conduit

Conduit is a streaming data pipeline framework that lets you build complex data processing workflows using simple YAML configurations instead of brittle scripts.

⁠Why Conduit?

Replace this:

# Fragile, hard-to-modify script
data = fetch_api_data()
filtered = [item for item in data if item['status'] == 'active']
processed = [transform(item) for item in filtered]
for item in processed:
    print(f"Result: {item}")

With this:

- id: conduit.RestApi
  url: "https://api.example.com/data"
- id: conduit.Filter
  condition: "input.status == 'active'"
- id: conduit.Transform
  template: "{{input | process}}"
- id: conduit.Console
  format: "Result: {{input}}"

⁠Key Benefits

  • 🔧 Composable: Mix and match 25+ built-in elements, or write your own
  • ⚡ Streaming: Memory-efficient, lazy processing of large datasets
  • 🚀 Fast: Get results as they're computed, not after everything finishes
  • 🌐 API-Ready: Built-in REST server for pipeline execution
  • 🎯 Type-Safe: Full IDE support with auto-completion and validation

⁠Quick Start

⁠Installation
pip install git+https://github.com/aniongithub/conduit.git
⁠Your First Pipeline

Create hello.yaml:

- id: conduit.Input
  data: [{message: "Hello, Conduit!"}]
- id: conduit.Console
  format: "{{input.message}}"

Run it:

conduit-cli hello.yaml
# Output: Hello, Conduit!
⁠API Server

Start the server:

conduit-cli serve --host 0.0.0.0 --port 8000

Execute pipelines via REST:

curl -X POST http://localhost:8000/run \
  -H "Content-Type: application/json" \
  -d '{"pipeline": [
    {"id": "conduit.Input", "data": [{"name": "World"}]},
    {"id": "conduit.Console", "format": "Hello, {{input.name}}!"}
  ]}'

⁠Examples

⁠Process Files
# Find and analyze Python files
- id: conduit.Glob
  pattern: "**/*.py"
- id: conduit.FileInfo
- id: conduit.Console
  format: "{{input.name}}: {{input.size}} bytes"
⁠Fetch API Data
# Get Pokemon data with custom limit
- id: conduit.RestApi
  url: "https://pokeapi.co/api/v2/pokemon?limit=${limit:-5}"
- id: conduit.JsonQuery
  query: ".results[].name"
- id: conduit.Console
  format: "Pokemon: {{input}}"

Run with arguments:

conduit-cli pokemon.yaml --args limit=10
⁠Complex Workflows
# Parallel processing with Fork
- id: conduit.RestApi
  url: "https://api.example.com/data"
- id: conduit.Fork
  paths:
    summary:
      - id: conduit.JsonQuery
        query: ".metadata.title"
    details:
      - id: conduit.JsonQuery
        query: ".content"
      - id: conduit.Filter
        condition: "len(input) > 100"
- id: conduit.Console
  format: "{{input.summary}}: {{input.details[:50]}}..."
⁠Using the API with Arguments
# Convert YAML to API request with yq
yq eval '{"pipeline": ., "args": {"limit": "10"}}' examples/pokemon_evolution.yaml -o=json | \
curl -X POST http://localhost:8000/run -H "Content-Type: application/json" -d @-

⁠Built-in Elements

CategoryElementsPurpose
InputInput, RestApi, Random, GlobData sources and generation
TransformFilter, JsonQuery, Extract, FormatData processing and extraction
FlowFork, Iterate, Identity, EmptyControl flow and parallelization
OutputConsole, DownloadResults and file operations
SystemCli, FileInfo, Find, PathSystem integration

⁠Development

⁠Dev Container Setup

This repository is meant for development with a VS Code dev container:

  1. Install Docker⁠ and VS Code⁠
  2. Install the Dev Containers extension⁠
  3. Open repository and select "Reopen in Container"
  4. Press F5 to run example pipelines or the server
⁠Creating Custom Elements
from dataclasses import dataclass
from typing import Generator, Iterator
from conduit import PipelineElement

@dataclass
class MyInput:
    value: str

class MyElement(PipelineElement):
    def process(self, input: Iterator[MyInput]) -> Generator[str, None, None]:
        for item in input:
            yield f"Processed: {item.value}"
⁠REST API Response Format
{
  "success": true,
  "results": ["item1", "item2", "item3"],
  "stdout": ["Console output line 1", "Console output line 2"],
  "stderr": [],
  "stats": {
    "duration": 1.23,
    "total_items_processed": 3,
    "throughput": 2.44,
    "element_metrics": [...]
  }
}

⁠Learn More

⁠License

MIT License - see LICENSE⁠ for details.

Tag summary

Content type

Image

Digest

sha256:ba99713f1…

Size

454.4 MB

Last updated

11 months ago

docker pull aniondocker/conduit-cli