☰ GDG /
Docstrings (001–005)
#001 gdtest_minimal #003 gdtest_sphinx #002 gdtest_google #004 gdtest_nodocs #005 gdtest_mixed_docs
Layouts (006–013)
#007 gdtest_python_layout #006 gdtest_src_layout #008 gdtest_lib_layout #009 gdtest_hatch #010 gdtest_setuptools_find #011 gdtest_setup_cfg #012 gdtest_setup_py #013 gdtest_auto_discover
Exports (014–017)
#014 gdtest_no_all #016 gdtest_config_exclude #015 gdtest_all_concat #017 gdtest_auto_exclude
Object Types (018–027)
#018 gdtest_small_class #020 gdtest_dataclasses #019 gdtest_big_class #021 gdtest_enums #022 gdtest_typed_containers #023 gdtest_protocols #024 gdtest_descriptors #026 gdtest_nested_class #025 gdtest_dunders #027 gdtest_constants
Directives (028–032)
#028 gdtest_seealso #029 gdtest_nodoc #030 gdtest_user_guide_auto #031 gdtest_user_guide_sections #032 gdtest_user_guide_subdirs
User Guide (033–038)
#033 gdtest_user_guide_explicit #034 gdtest_user_guide_custom_dir
#037 gdtest_index_qmd FAIL
#036 gdtest_readme_rst #035 gdtest_user_guide_hyphen #038 gdtest_index_md
Landing Pages (039–043)
#041 gdtest_index_frontmatter FAIL
#039 gdtest_no_readme #040 gdtest_index_wins #043 gdtest_github_contrib #042 gdtest_full_extras
Extras & Config (044–050)
#044 gdtest_cli_click #045 gdtest_cli_nested #047 gdtest_explicit_ref #046 gdtest_cli_typer #049 gdtest_name_mismatch #048 gdtest_kitchen_sink #050 gdtest_src_big_class
Cross-Dimension (051–065)
#051 gdtest_google_big_class #052 gdtest_user_guide_cli #053 gdtest_explicit_big_class #054 gdtest_src_no_all #056 gdtest_google_seealso #055 gdtest_extras_guide #057 gdtest_setup_cfg_src #058 gdtest_exclude_cli #059 gdtest_src_explicit_ref #060 gdtest_async_funcs #061 gdtest_generators #063 gdtest_abstract_props #062 gdtest_overloads #064 gdtest_multi_inherit #065 gdtest_slots_class
API Patterns (066–077)
#066 gdtest_frozen_dc #067 gdtest_generics #068 gdtest_context_mgr #069 gdtest_decorators #071 gdtest_reexports #070 gdtest_exceptions #073 gdtest_deep_nesting #072 gdtest_many_exports #074 gdtest_long_docs #075 gdtest_many_guides #077 gdtest_flit #076 gdtest_many_big_classes
Scale & Stress (078–082)
#078 gdtest_pdm #079 gdtest_namespace #080 gdtest_monorepo #081 gdtest_multi_module #082 gdtest_src_legacy
Build Systems (083–088)
#083 gdtest_empty_module #084 gdtest_all_private #085 gdtest_duplicate_all #086 gdtest_badge_readme #087 gdtest_math_docs #088 gdtest_mixed_guide_ext
Edge Cases (089–095)
#089 gdtest_unicode_docs #090 gdtest_config_all_on #091 gdtest_config_display #092 gdtest_config_minimal #093 gdtest_config_parser #094 gdtest_config_extra_keys #095 gdtest_github_icon
Config Matrix (096–100)
#096 gdtest_source_branch #097 gdtest_source_path #098 gdtest_source_title #099 gdtest_source_disabled #100 gdtest_sidebar_disabled
Config Options (101–125)
#101 gdtest_sidebar_min_items #103 gdtest_cli_name #104 gdtest_dynamic_false #102 gdtest_sidebar_float #105 gdtest_parser_google #106 gdtest_parser_sphinx #107 gdtest_display_name #108 gdtest_funding #109 gdtest_authors_multi #110 gdtest_no_darkmode #111 gdtest_exclude_list #112 gdtest_jupyter_kernel #113 gdtest_config_sections #114 gdtest_config_ug_string #115 gdtest_config_ug_list #116 gdtest_config_changelog #117 gdtest_config_reference #118 gdtest_config_combo_a
#122 gdtest_config_combo_e FAIL
#119 gdtest_config_combo_b #120 gdtest_config_combo_c #121 gdtest_config_combo_d #123 gdtest_config_combo_f #124 gdtest_attribution_on #125 gdtest_attribution_off
Docstring Richness (126–150)
#126 gdtest_rst_versionadded #127 gdtest_rst_deprecated #128 gdtest_rst_note #129 gdtest_rst_warning #130 gdtest_rst_tip #131 gdtest_rst_caution #132 gdtest_rst_danger #133 gdtest_rst_important #134 gdtest_rst_mixed_dirs #135 gdtest_directives #136 gdtest_sphinx_func_role #137 gdtest_sphinx_class_role #138 gdtest_sphinx_exc_role #139 gdtest_sphinx_meth_role #140 gdtest_sphinx_mixed_roles #141 gdtest_numpy_rich #142 gdtest_google_rich #143 gdtest_sphinx_rich #144 gdtest_docstring_examples #145 gdtest_examples_rst_repro #146 gdtest_docstring_notes #147 gdtest_docstring_warnings #148 gdtest_docstring_references #149 gdtest_docstring_seealso #150 gdtest_docstring_math
UG Variations (151–165)
#151 gdtest_docstring_tables #152 gdtest_docstring_combo #153 gdtest_ug_auto #154 gdtest_ug_numbered #155 gdtest_ug_sections_fm #156 gdtest_ug_subdirs #157 gdtest_ug_custom_dir #158 gdtest_ug_deep_nest #159 gdtest_ug_mixed_ext #161 gdtest_ug_explicit_order #160 gdtest_ug_many_pages #162 gdtest_ug_single_page #163 gdtest_ug_no_frontmatter
#164 gdtest_ug_with_code FAIL
#165 gdtest_ug_with_images
Custom Sections (166–175)
#166 gdtest_ug_hyphen_dir #167 gdtest_ug_combo #168 gdtest_sec_examples #169 gdtest_sec_tutorials #170 gdtest_sec_recipes #171 gdtest_sec_blog #172 gdtest_sec_faq #173 gdtest_sec_multi #174 gdtest_sec_navbar_after #175 gdtest_sec_with_ug
Reference Config (176–185)
#176 gdtest_sec_with_ref #177 gdtest_sec_deep #178 gdtest_sec_index_opt #181 gdtest_custom_passthrough_navbar #180 gdtest_sec_sidebar_single #179 gdtest_sec_index_hero #182 gdtest_custom_raw_navbar_after #185 gdtest_custom_basename_output #183 gdtest_custom_mixed_modes #184 gdtest_custom_nested_combo
Site Theming (186–195)
#186 gdtest_custom_nested_output #187 gdtest_custom_missing_dir_combo #189 gdtest_ref_members_false #188 gdtest_ref_explicit #190 gdtest_ref_mixed #191 gdtest_ref_reorder #193 gdtest_ref_single_section #192 gdtest_ref_sectioned #194 gdtest_ref_module_expand #195 gdtest_ref_big_class
Stress Tests (196–200)
#196 gdtest_ref_multi_big #197 gdtest_ref_title #198 gdtest_theme_cosmo #199 gdtest_theme_lumen #200 gdtest_theme_cerulean #201 gdtest_toc_disabled #202 gdtest_toc_depth #203 gdtest_toc_title #204 gdtest_site_combo #205 gdtest_display_badges #206 gdtest_display_authors #207 gdtest_display_funding #208 gdtest_stress_all_config #209 gdtest_stress_all_docstr #210 gdtest_stress_all_ug #211 gdtest_stress_all_sections #213 gdtest_src_google_seealso #212 gdtest_stress_everything #214 gdtest_hatch_nodoc #215 gdtest_pdm_big_class #216 gdtest_flit_enums #217 gdtest_namespace_ug #218 gdtest_ug_subdir_numbered #219 gdtest_homepage_ug #221 gdtest_logo #222 gdtest_hero_basic #223 gdtest_hero_readme_badges #224 gdtest_hero_disabled #220 gdtest_long_names #225 gdtest_hero_custom #226 gdtest_hero_wordmark #227 gdtest_hero_no_logo #228 gdtest_hero_explicit_badges #229 gdtest_hero_index_qmd #230 gdtest_hero_auto_logo #231 gdtest_md_disabled #232 gdtest_md_no_widget #233 gdtest_announce_simple #234 gdtest_announce_dict #235 gdtest_announce_disabled #236 gdtest_gradient_sky #237 gdtest_gradient_peach #238 gdtest_gradient_prism #239 gdtest_gradient_lilac #240 gdtest_gradient_slate #241 gdtest_gradient_honey #242 gdtest_gradient_dusk #243 gdtest_gradient_mint #244 gdtest_gradient_navbar #245 gdtest_gradient_both #246 gdtest_gradient_mixed #247 gdtest_gradient_no_dismiss #248 gdtest_header_text #249 gdtest_header_list #250 gdtest_header_file #252 gdtest_navbar_color_light #251 gdtest_navbar_color #253 gdtest_navbar_color_dark #254 gdtest_navbar_color_same #255 gdtest_navbar_color_split #256 gdtest_kitchen_sink_q #257 gdtest_stress_everything_q #258 gdtest_seealso_desc #259 gdtest_numpy_seealso_desc #260 gdtest_interlinks #261 gdtest_autolink #262 gdtest_skill_default #263 gdtest_skill_curated #265 gdtest_skill_disabled #264 gdtest_skill_config #266 gdtest_skill_rich #267 gdtest_skill_combo
#269 gdtest_i18n_french FAIL
#268 gdtest_skill_complex
#270 gdtest_i18n_japanese FAIL
#272 gdtest_code_cells FAIL
#271 gdtest_i18n_arabic FAIL
#274 gdtest_page_tags #276 gdtest_tag_location #275 gdtest_page_status #273 gdtest_nav_icons
#279 gdtest_gt_tables FAIL
#280 gdtest_scale_to_fit FAIL
#281 gdtest_scale_min_scale FAIL
#278 gdtest_homepage_ug_subdirs #277 gdtest_icon_shortcode #282 gdtest_homepage_wide #283 gdtest_code_span_headings #286 gdtest_namespace_src #284 gdtest_sec_blog_user_index #285 gdtest_sec_dir_titles #287 gdtest_auto_include #288 gdtest_no_auto_exclude
#289 gdtest_tbl_preview FAIL
#290 gdtest_tbl_shortcode
#291 gdtest_tbl_explorer FAIL
#292 gdtest_hr_shortcode #293 gdtest_accent_color #294 gdtest_keys_shortcode #295 gdtest_inline_methods #296 gdtest_inline_always #297 gdtest_inline_never #299 gdtest_ref_inherited_explicit #300 gdtest_ref_include_inherited #298 gdtest_inline_threshold
#301 gdtest_mock_code FAIL
#305 gdtest_hero_no_name #304 gdtest_lightbox #302 gdtest_details_shortcode #303 gdtest_termshow #306 gdtest_sec_nested_tags #307 gdtest_sec_xref_subdirs #309 gdtest_bibliography_csl #308 gdtest_bibliography #311 gdtest_go_cli #310 gdtest_custom_css #312 gdtest_ug_dark_assets #313 gdtest_code_include #314 gdtest_ug_mixed_subdir_order #315 gdtest_type_aliases #317 gdtest_marimo #316 gdtest_complete_docstrings #318 gdtest_no_breadcrumbs #321 gdtest_ref_section_order #319 gdtest_mcp #320 gdtest_d2_diagrams
307/321 built ⏱ 1m 3s 🧪 17/17

gdtest-sec-index-hero

Test package demonstrating enhanced section index pages with hero images.

  • Demos: 2-column layout with 4 featured image cards + 6 plain links
  • Gallery: 1-column layout with 4 full-width image cards

Section index hero cards: Demos section with 2-col image cards (4 featured + 6 plain links), Gallery section with 1-col image cards (index_columns: 1). Tests mixed image/plain and column options.

Source files
📁 demos/
📄 01-starter-demo.qmd
---
title: Starter Demo
description: A minimal example showing the basics of data processing.
image: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='600' height='300'%3E%3Crect fill='%234A90D9' width='600' height='300'/%3E%3Ctext x='300' y='160' text-anchor='middle' fill='white' font-size='28' font-family='sans-serif'%3EStarter Demo%3C/text%3E%3C/svg%3E"
---

# Starter Demo

This demo walks through the most basic usage of the package.

```python
from gdtest_sec_index_hero import process

result = process([1, 2, None, 3], strict=True)
print(result)  # [1, 2, 3]
```

The `strict` parameter filters out `None` values, giving you a clean list.
📄 02-advanced-demo.qmd
---
title: Advanced Demo
description: A comprehensive example with chained operations and validation.
image: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='600' height='300'%3E%3Crect fill='%2342B883' width='600' height='300'/%3E%3Ctext x='300' y='160' text-anchor='middle' fill='white' font-size='28' font-family='sans-serif'%3EAdvanced Demo%3C/text%3E%3C/svg%3E"
---

# Advanced Demo

This demo chains multiple operations together.

```python
from gdtest_sec_index_hero import process, summarize, validate

data = process([10, 20, None, 30, 40], strict=True)
stats = summarize(data)
print(stats)  # {'count': 4, 'sum': 100, 'mean': 25.0}

schema = {'count': int, 'sum': int, 'mean': float}
assert validate(schema, stats)
```
📄 03-data-pipeline.qmd
---
title: Data Pipeline
description: Build a complete ETL pipeline from raw data to validated output.
image: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='600' height='300'%3E%3Crect fill='%23E8853D' width='600' height='300'/%3E%3Ctext x='300' y='160' text-anchor='middle' fill='white' font-size='28' font-family='sans-serif'%3EData Pipeline%3C/text%3E%3C/svg%3E"
---

# Data Pipeline

A step-by-step guide to building a data pipeline.

## Step 1: Extract

```python
raw = [100, None, 200, None, 300]
```

## Step 2: Transform

```python
from gdtest_sec_index_hero import process
clean = process(raw, strict=True)  # [100, 200, 300]
```

## Step 3: Load

```python
from gdtest_sec_index_hero import summarize
output = summarize(clean)
print(output)  # {'count': 3, 'sum': 600, 'mean': 200.0}
```
📄 04-visualization.qmd
---
title: Visualization
description: Create summary visualizations from processed data.
image: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='600' height='300'%3E%3Crect fill='%237C4DFF' width='600' height='300'/%3E%3Ctext x='300' y='160' text-anchor='middle' fill='white' font-size='28' font-family='sans-serif'%3EVisualization%3C/text%3E%3C/svg%3E"
---

# Visualization

After processing and summarizing data, you can visualize the results.

```python
from gdtest_sec_index_hero import process, summarize

data = process([5, 15, 25, 35, 45])
stats = summarize(data)
print(f"Mean: {stats['mean']}, Total: {stats['sum']}")
```

Use these summary statistics as input to your favorite plotting library.
📄 05-error-handling.qmd
---
title: Error Handling
description: Learn how to handle edge cases and invalid inputs gracefully.
---

# Error Handling

When working with real-world data you need to handle edge cases.

```python
from gdtest_sec_index_hero import process, validate

# Empty lists are handled cleanly
result = process([], strict=True)
print(result)  # []

# Validation catches missing fields
assert not validate({'name': str}, {'age': 30})
```
📄 06-batch-processing.qmd
---
title: Batch Processing
description: Process multiple datasets in batch mode.
---

# Batch Processing

Process several datasets at once.

```python
from gdtest_sec_index_hero import process, summarize

datasets = [
    [10, 20, 30],
    [5, None, 15],
    [100, 200, 300],
]

for ds in datasets:
    clean = process(ds, strict=True)
    print(summarize(clean))
```
📄 07-schema-patterns.qmd
---
title: Common Schema Patterns
description: Reusable validation schemas for typical data structures.
---

# Common Schema Patterns

Define reusable schemas for common record types.

```python
from gdtest_sec_index_hero import validate

user_schema = {'name': str, 'age': int}
event_schema = {'type': str, 'timestamp': float}

assert validate(user_schema, {'name': 'Alice', 'age': 30})
assert validate(event_schema, {'type': 'click', 'timestamp': 1.0})
```
📄 08-performance-tips.qmd
---
title: Performance Tips
description: Optimize processing speed for large datasets.
---

# Performance Tips

Tips for working efficiently with large volumes of data.

- Use `strict=False` (the default) when you know data is clean
- Pre-validate schemas once, then batch-process records
- Use `summarize()` to get aggregate stats without storing intermediates
📄 09-integration-guide.qmd
---
title: Integration Guide
description: Integrate the package with pandas, Polars, and other frameworks.
---

# Integration Guide

How to use this package alongside popular data frameworks.

## With plain Python

```python
from gdtest_sec_index_hero import process
result = process([1, 2, 3])
```

## Converting results

The `summarize()` function returns a plain dict, making it easy
to convert to any format you need.
📄 10-custom-validators.qmd
---
title: Custom Validators
description: Build your own validation logic on top of the validate function.
---

# Custom Validators

Extend the built-in `validate()` with custom rules.

```python
from gdtest_sec_index_hero import validate

def validate_positive(record):
    base_ok = validate({'value': int}, record)
    return base_ok and record['value'] > 0

assert validate_positive({'value': 42})
assert not validate_positive({'value': -1})
```
📁 gallery/
📄 01-real-time-dashboard.qmd
---
title: Real-Time Dashboard
description: A live dashboard that processes streaming data and displays rolling statistics.
image: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='600' height='300'%3E%3Crect fill='%23E53935' width='600' height='300'/%3E%3Ctext x='300' y='160' text-anchor='middle' fill='white' font-size='28' font-family='sans-serif'%3EReal-Time%3C/text%3E%3C/svg%3E"
---

# Real-Time Dashboard

This example shows a dashboard that consumes a data stream,
processes each batch, and updates summary statistics in real time.

```python
from gdtest_sec_index_hero import process, summarize

# Simulate a streaming batch
batch = [42, None, 87, 13, None, 65]
clean = process(batch, strict=True)
stats = summarize(clean)
print(stats)
```
📄 02-workflow-automation.qmd
---
title: Workflow Automation
description: An automated pipeline that validates, processes, and reports on incoming records.
image: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='600' height='300'%3E%3Crect fill='%23009688' width='600' height='300'/%3E%3Ctext x='300' y='160' text-anchor='middle' fill='white' font-size='28' font-family='sans-serif'%3EWorkflow%3C/text%3E%3C/svg%3E"
---

# Workflow Automation

Automate your data quality workflow end to end.

```python
from gdtest_sec_index_hero import validate, process, summarize

schema = {'value': int}
records = [{'value': 10}, {'value': 20}, {'value': 30}]

valid = [r for r in records if validate(schema, r)]
values = [r['value'] for r in valid]
clean = process(values, strict=True)
report = summarize(clean)
print(report)
```
📄 03-data-explorer.qmd
---
title: Data Explorer
description: An interactive data exploration tool that lets you filter, summarize, and drill down.
image: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='600' height='300'%3E%3Crect fill='%237C4DFF' width='600' height='300'/%3E%3Ctext x='300' y='160' text-anchor='middle' fill='white' font-size='28' font-family='sans-serif'%3EVisualization%3C/text%3E%3C/svg%3E"
---

# Data Explorer

Explore datasets interactively by processing subsets and reviewing statistics.

```python
from gdtest_sec_index_hero import process, summarize

dataset = [5, 10, 15, 20, 25, 30, 35, 40]

# Filter to values above 15
subset = [x for x in process(dataset) if x > 15]
print(summarize(subset))
```
📄 04-quality-report.qmd
---
title: Quality Report
description: Generate a comprehensive data quality report with validation summaries.
image: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='600' height='300'%3E%3Crect fill='%234A90D9' width='600' height='300'/%3E%3Ctext x='300' y='160' text-anchor='middle' fill='white' font-size='28' font-family='sans-serif'%3EStarter Demo%3C/text%3E%3C/svg%3E"
---

# Quality Report

Produce a data quality report by validating every record.

```python
from gdtest_sec_index_hero import validate

schema = {'name': str, 'score': int}
records = [
    {'name': 'Alice', 'score': 95},
    {'name': 'Bob'},
    {'name': 'Carol', 'score': 88},
]

passed = sum(1 for r in records if validate(schema, r))
print(f"{passed}/{len(records)} records valid")
```
📁 gdtest_sec_index_hero/
📄 __init__.py
"""Test package for section index hero cards."""

from .core import process, summarize, validate

__all__ = ["process", "summarize", "validate"]
📄 core.py
"""Core processing functions."""


def process(data: list, *, strict: bool = False) -> list:
    """Process a list of values.

    Parameters
    ----------
    data : list
        Input values to process.
    strict : bool
        If True, raise on invalid values.

    Returns
    -------
    list
        Processed values.

    Examples
    --------
    >>> process([1, 2, 3])
    [1, 2, 3]
    """
    return [x for x in data if x is not None] if strict else list(data)


def summarize(values: list) -> dict:
    """Summarize a list of numeric values.

    Parameters
    ----------
    values : list
        Numeric values to summarize.

    Returns
    -------
    dict
        Summary with count, sum, and mean.

    Examples
    --------
    >>> summarize([10, 20, 30])
    {'count': 3, 'sum': 60, 'mean': 20.0}
    """
    n = len(values)
    total = sum(values)
    return {"count": n, "sum": total, "mean": total / n if n else 0}


def validate(schema: dict, record: dict) -> bool:
    """Validate a record against a schema.

    Parameters
    ----------
    schema : dict
        Expected field names mapped to types.
    record : dict
        The record to validate.

    Returns
    -------
    bool
        True if the record conforms to the schema.

    Examples
    --------
    >>> validate({"name": str}, {"name": "Alice"})
    True
    """
    for key, expected_type in schema.items():
        if key not in record or not isinstance(record[key], expected_type):
            return False
    return True
📄 README.md
# gdtest-sec-index-hero

Test package demonstrating enhanced section index pages with hero images.

- **Demos**: 2-column layout with 4 featured image cards + 6 plain links
- **Gallery**: 1-column layout with 4 full-width image cards
📄 great-docs.yml
sections:
  - title: Demos
    dir: demos
    index: true
  - title: Gallery
    dir: gallery
    index: true
    index_columns: 1
    navbar_after: Demos