← GDG /

#269 gdtest_nav_icons

#269 gdtest_nav_icons OK CONFIG
Navigation icons on navbar and sidebar entries
Showcases Lucide navigation icons on both the navbar (User Guide, Recipes, Reference) and sidebar section headings (Getting Started, Configuration, Visualization, Advanced Topics, Functions, Classes). Each entry should have a small inline SVG icon prepended to its label for quick visual scanning. The site also uses the 'sky' gradient and an announcement banner.
View Site → Build Log ๐Ÿงช Test Coverage

Build Mode

● Has great-docs.yml

This package ships a pre-supplied config. The great-docs init step is skipped and great-docs build uses the spec-defined configuration directly. Tests specific config options and their rendered output.

Dimensions

A1 B1 C4 D2 E6 F1 G1 H7 K53 N2
A1Flat layoutlayout
B1Explicit __all__exports
C4Mixed class+funcobjects
D2Googledocstrings
E6No directivesdirectives
F1Auto-discoveruser_guide
G1README.mdlanding
H7No extrasextras
K53nav_icons configconfig
N2Tutorials sectionsections

Source Files

๐Ÿ“ gdtest_nav_icons/
๐Ÿ“„ __init__.py
"""NavIcons Demo โ€” a data-analysis toolkit showcasing navigation icons."""

__version__ = "1.0.0"

from .analysis import Pipeline, analyze, summarize, transform
from .charts import BarChart, LineChart, plot
from .io import load_csv, save_csv, export_json

__all__ = [
    "Pipeline",
    "analyze",
    "summarize",
    "transform",
    "BarChart",
    "LineChart",
    "plot",
    "load_csv",
    "save_csv",
    "export_json",
]
๐Ÿ“„ analysis.py
"""Data analysis utilities."""


def analyze(data: list[float]) -> dict[str, float]:
    """Run a basic statistical analysis on numeric data.

    Args:
        data: A list of numeric values to analyze.

    Returns:
        A dict with keys ``mean``, ``min``, ``max``, and ``count``.

    Examples:
        >>> analyze([1.0, 2.0, 3.0])
        {'mean': 2.0, 'min': 1.0, 'max': 3.0, 'count': 3}
    """
    return {
        "mean": sum(data) / len(data),
        "min": min(data),
        "max": max(data),
        "count": len(data),
    }


def summarize(data: list[float], label: str = "result") -> str:
    """Produce a one-line summary string for a dataset.

    Args:
        data: Numeric values.
        label: Human-readable label for the summary.

    Returns:
        A formatted summary string.
    """
    stats = analyze(data)
    return f"{label}: mean={stats['mean']:.2f}, n={stats['count']}"


def transform(data: list[float], *, scale: float = 1.0, offset: float = 0.0) -> list[float]:
    """Apply a linear transform to every element.

    Args:
        data: Input values.
        scale: Multiplicative factor.
        offset: Additive constant applied after scaling.

    Returns:
        A new list of transformed values.
    """
    return [x * scale + offset for x in data]


class Pipeline:
    """An ordered sequence of analysis stages.

    Construct a pipeline from callables, then run data through
    each stage in sequence.

    Args:
        name: Human-readable pipeline identifier.

    Attributes:
        name: Pipeline name.
        stages: Ordered list of stage callables.

    Examples:
        >>> p = Pipeline("demo")
        >>> p.add_stage(lambda x: [v * 2 for v in x])
        >>> p.run([1, 2, 3])
        [2, 4, 6]
    """

    def __init__(self, name: str):
        self.name = name
        self.stages: list = []

    def add_stage(self, fn) -> None:
        """Append a processing stage.

        Args:
            fn: A callable that accepts and returns a list.
        """
        self.stages.append(fn)

    def run(self, data: list) -> list:
        """Execute all stages sequentially.

        Args:
            data: Input data list.

        Returns:
            The data after passing through every stage.
        """
        for fn in self.stages:
            data = fn(data)
        return data

    def clear(self) -> None:
        """Remove all stages from the pipeline."""
        self.stages.clear()

    def __len__(self) -> int:
        return len(self.stages)

    def __repr__(self) -> str:
        return f"Pipeline({self.name!r}, stages={len(self)})"
๐Ÿ“„ charts.py
"""Chart rendering utilities."""

from __future__ import annotations


class BarChart:
    """A horizontal bar chart renderer.

    Args:
        title: Chart title displayed above the bars.
        width: Maximum bar width in characters.

    Attributes:
        title: Chart title.
        width: Bar width cap.
        data: Mapping of labels to values.
    """

    def __init__(self, title: str = "Chart", width: int = 40):
        self.title = title
        self.width = width
        self.data: dict[str, float] = {}

    def add(self, label: str, value: float) -> None:
        """Add a data point to the chart.

        Args:
            label: Bar label.
            value: Numeric value.
        """
        self.data[label] = value

    def render(self) -> str:
        """Render the chart as a text string.

        Returns:
            Multi-line string with the rendered bar chart.
        """
        if not self.data:
            return f"{self.title}\n(no data)"
        mx = max(self.data.values())
        lines = [self.title, "=" * len(self.title)]
        for label, val in self.data.items():
            bar_len = int(val / mx * self.width) if mx else 0
            lines.append(f"  {label:>10s} | {'โ–ˆ' * bar_len} {val}")
        return "\n".join(lines)


class LineChart:
    """A simple line chart renderer.

    Args:
        title: Chart title.
        height: Vertical resolution in rows.

    Attributes:
        title: Chart title.
        height: Row count for rendering.
        series: Stored data series.
    """

    def __init__(self, title: str = "Line", height: int = 10):
        self.title = title
        self.height = height
        self.series: list[list[float]] = []

    def add_series(self, values: list[float]) -> None:
        """Add a data series.

        Args:
            values: Y-axis values for the series.
        """
        self.series.append(values)

    def render(self) -> str:
        """Render the chart as text.

        Returns:
            Multi-line text representation.
        """
        return f"{self.title} ({len(self.series)} series)"


def plot(x: list[float], y: list[float], *, kind: str = "scatter") -> str:
    """Produce a quick text-based plot.

    Args:
        x: X-axis values.
        y: Y-axis values.
        kind: Plot type โ€” ``"scatter"`` or ``"line"``.

    Returns:
        A string representation of the plot.

    Raises:
        ValueError: If ``x`` and ``y`` have different lengths.
    """
    if len(x) != len(y):
        raise ValueError("x and y must have the same length")
    return f"{kind} plot with {len(x)} points"
๐Ÿ“„ io.py
"""Data I/O helpers."""

from __future__ import annotations


def load_csv(path: str, *, delimiter: str = ",", header: bool = True) -> list[dict]:
    """Load a CSV file into a list of row dicts.

    Args:
        path: File path to read.
        delimiter: Column separator character.
        header: Whether the first row contains column names.

    Returns:
        A list of dicts, one per data row.
    """
    return [{"_path": path, "_delim": delimiter, "_header": header}]


def save_csv(data: list[dict], path: str, *, delimiter: str = ",") -> None:
    """Save a list of row dicts to a CSV file.

    Args:
        data: Rows to write.
        path: Destination file path.
        delimiter: Column separator character.
    """
    pass


def export_json(data: list[dict], path: str, *, indent: int = 2) -> None:
    """Export data as a formatted JSON file.

    Args:
        data: Data to serialize.
        path: Destination file path.
        indent: Number of spaces for pretty-printing.
    """
    pass
๐Ÿ“ recipes/
๐Ÿ“„ 01-quick-analysis.qmd
---
title: Quick Analysis
---

# Quick Analysis Recipe

Run a full analysis in three lines:

```python
from gdtest_nav_icons import load_csv, analyze

data = load_csv("measurements.csv")
stats = analyze([row["value"] for row in data])
```
๐Ÿ“„ 02-batch-export.qmd
---
title: Batch Export
---

# Batch Export Recipe

Export multiple datasets at once:

```python
from gdtest_nav_icons import save_csv, export_json

datasets = {"train": [...], "test": [...]}
for name, rows in datasets.items():
    save_csv(rows, f"{name}.csv")
    export_json(rows, f"{name}.json")
```
๐Ÿ“„ 03-chart-dashboard.qmd
---
title: Chart Dashboard
---

# Chart Dashboard Recipe

Build a simple terminal dashboard:

```python
from gdtest_nav_icons import BarChart, LineChart

bar = BarChart("Revenue")
bar.add("Q1", 100)
bar.add("Q2", 130)
bar.add("Q3", 115)
bar.add("Q4", 160)

line = LineChart("Growth")
line.add_series([100, 130, 115, 160])

print(bar.render())
print()
print(line.render())
```
๐Ÿ“ tutorials/
๐Ÿ“ advanced/
๐Ÿ“„ 01-chart-basics.qmd
---
title: Chart Basics
---

# Chart Basics

Quick introduction to text-based charting.

## Creating a Bar Chart

```python
from gdtest_nav_icons import BarChart

chart = BarChart("Scores")
chart.add("Alice", 95)
chart.add("Bob", 87)
print(chart.render())
```

## Creating a Line Chart

```python
from gdtest_nav_icons import LineChart

lc = LineChart("Trend")
lc.add_series([10, 15, 12, 18])
print(lc.render())
```
๐Ÿ“„ 02-exporting.qmd
---
title: Exporting
---

# Exporting

Save processed data to disk in various formats.

## CSV Export

```python
from gdtest_nav_icons import save_csv

save_csv([{"name": "Alice", "score": 95}], "results.csv")
```

## JSON Export

```python
from gdtest_nav_icons import export_json

export_json([{"metric": "accuracy", "value": 0.92}], "metrics.json")
```
๐Ÿ“„ 03-summary-reports.qmd
---
title: Summary Reports
---

# Summary Reports

Generate human-readable summaries of datasets.

```python
from gdtest_nav_icons import summarize

print(summarize([88, 92, 79, 95, 100], label="Exam scores"))
# Exam scores: mean=90.80, n=5
```

## Custom Labels

The ``label`` parameter controls the prefix in the output string.
๐Ÿ“ basics/
๐Ÿ“„ 01-fundamentals.qmd
---
title: Fundamentals
---

# Fundamentals

Learn the core concepts behind data analysis with NavIcons Demo.

## Data Types

All analysis functions work with `list[float]` inputs:

```python
from gdtest_nav_icons import analyze

analyze([1.0, 2.0, 3.0])
```

## Return Types

Results are always plain Python dicts or strings โ€” no custom types.
๐Ÿ“„ 02-data-loading.qmd
---
title: Data Loading
---

# Data Loading

Load data from CSV files into Python data structures.

```python
from gdtest_nav_icons import load_csv

rows = load_csv("data.csv")
values = [row["value"] for row in rows]
```

## Delimiter Options

Use ``delimiter`` for TSV or other formats:

```python
rows = load_csv("data.tsv", delimiter="\t")
```
๐Ÿ“„ 03-pipelines.qmd
---
title: Pipelines
---

# Pipelines

Build composable processing workflows with the Pipeline class.

```python
from gdtest_nav_icons import Pipeline, transform

pipe = Pipeline("clean")
pipe.add_stage(lambda d: [x for x in d if x > 0])
pipe.add_stage(lambda d: transform(d, scale=0.01))
result = pipe.run([-5, 10, 20, -3, 15])
```

## Pipeline Inspection

```python
len(pipe)   # number of stages
repr(pipe)  # Pipeline('clean', stages=2)
```
๐Ÿ“ user_guide/
๐Ÿ“„ 01-getting-started.qmd
---
title: Getting Started
---

# Getting Started

Welcome to **NavIcons Demo** โ€” a data-analysis toolkit that
showcases Lucide navigation icons in every corner of the site.

## Installation

```bash
pip install gdtest-nav-icons
```

## Quick Example

```python
from gdtest_nav_icons import analyze

result = analyze([10, 20, 30, 40])
print(result)
# {'mean': 25.0, 'min': 10, 'max': 40, 'count': 4}
```

## What's Next?

- Learn about [Configuration](configuration.qmd) options
- Explore the [Visualization](visualization.qmd) guide
- Dive into [Advanced Topics](advanced-topics.qmd)
๐Ÿ“„ 02-configuration.qmd
---
title: Configuration
---

# Configuration

Configure NavIcons Demo through Python or YAML.

## Pipeline Setup

```python
from gdtest_nav_icons import Pipeline, transform

pipe = Pipeline("preprocess")
pipe.add_stage(lambda data: transform(data, scale=2.0))
pipe.add_stage(lambda data: transform(data, offset=-1.0))

result = pipe.run([1.0, 2.0, 3.0])
```

## CSV Options

Use `load_csv` with custom delimiters:

```python
from gdtest_nav_icons import load_csv

data = load_csv("data.tsv", delimiter="\t")
```
๐Ÿ“„ 03-visualization.qmd
---
title: Visualization
---

# Visualization

Create quick text-based charts for terminal output.

## Bar Charts

```python
from gdtest_nav_icons import BarChart

chart = BarChart("Sales by Region")
chart.add("North", 120)
chart.add("South", 85)
chart.add("East", 200)
chart.add("West", 150)
print(chart.render())
```

## Line Charts

```python
from gdtest_nav_icons import LineChart

lc = LineChart("Temperature")
lc.add_series([20, 22, 19, 25, 28, 26])
print(lc.render())
```

## Quick Plots

```python
from gdtest_nav_icons import plot

output = plot([1, 2, 3, 4], [10, 20, 15, 30], kind="line")
print(output)
```
๐Ÿ“„ 04-advanced-topics.qmd
---
title: Advanced Topics
---

# Advanced Topics

## Custom Pipeline Stages

Build complex analysis workflows by chaining stages:

```python
from gdtest_nav_icons import Pipeline, analyze, summarize

pipe = Pipeline("full-analysis")
pipe.add_stage(lambda d: [x for x in d if x > 0])  # filter
pipe.add_stage(lambda d: [x ** 0.5 for x in d])    # sqrt

clean_data = pipe.run([-1, 4, 9, -2, 16, 25])
print(analyze(clean_data))
```

## Exporting Results

```python
from gdtest_nav_icons import export_json

results = [{"metric": "accuracy", "value": 0.95}]
export_json(results, "output.json", indent=4)
```

## Summary Reports

```python
from gdtest_nav_icons import summarize

print(summarize([88, 92, 79, 95, 100], label="Exam scores"))
```
๐Ÿ“„ README.md
# NavIcons Demo

A data-analysis toolkit that showcases **Lucide navigation icons**
on both the navbar and sidebar. Every major navigation entry โ€”
User Guide, Tutorials, Recipes, Reference, and sidebar section
headers โ€” is prefixed with an inline SVG icon for quick visual
scanning. The Tutorials section deliberately uses incomplete
icon coverage to verify icons work when only some items have them.

## Features

- **Statistical analysis**: `analyze()`, `summarize()`, `transform()`
- **Charting**: `BarChart`, `LineChart`, `plot()`
- **I/O**: `load_csv()`, `save_csv()`, `export_json()`
- **Pipelines**: `Pipeline` for composable data workflows

## Quick Start

```python
from gdtest_nav_icons import analyze

print(analyze([1, 2, 3, 4, 5]))
```
๐Ÿ“„ great-docs.yml
display_name: NavIcons Demo
parser: google
navbar_style: sky
announcement:
  content: Navigation icons powered by Lucide โ€” lightweight open-source SVGs
  type: info
  dismissable: true
sections:
  - title: Tutorials
    dir: tutorials
nav_icons:
  navbar:
    User Guide: book-open
    Tutorials: lightbulb
    Recipes: chef-hat
    Reference: code-2
  sidebar:
    Getting Started: rocket
    Configuration: settings
    Visualization: chart-line
    Advanced Topics: graduation-cap
    Functions: zap
    Classes: blocks
    Basics: book
    Advanced: trophy
    Fundamentals: compass
    Pipelines: git-branch
    Exporting: download