---
title: Table Configuration (table_config.yaml)
---

# Specification: Table Configuration (table_config.yaml)

## Title and Purpose

Defines the **external, user-editable YAML file** (`table_config.yaml`) that controls which columns appear in the repository-overview table, their order, labels, visibility, and the default sort order & group notes used by downstream renderers.  
The file is loaded at runtime via `Settings.table_config` (see `src/gitlab_overviewer/config/settings.py`) and is consumed by the **sorting** and **rendering** infrastructure ([Table Sorting](./spec_table_sorting.md), [Table Rendering & UI](./spec_table_rendering_ui.md)).

## Scope and Boundaries

* **In scope** – file structure, required/optional keys, validation rules, default behaviour, error handling.
* **Out of scope** – CLI flags that override sorting (`--sort`) or alternative configuration sources.
* **Dependencies** – relies on the column semantics defined in the data model and the behaviour specified in related specs above.

---

## 1  YAML Top-Level Keys

| Key | Type | Required | Purpose |
|-----|------|----------|---------|
| `columns` | list(dict) | **Yes** | Declares table columns (order = list order). |
| `default_sort` | list(str) | No | Fallback sort keys (§3) when the user supplies none. |
| `group_notes` | dict | No | Optional explanatory notes rendered under group sections. |

Any additional keys are ignored and MUST NOT influence program flow.

---

## 2  `columns` Entries

Each element of `columns` is a mapping with the following fields:

| Field | Type | Required | Default | Behaviour |
|-------|------|----------|---------|-----------|
| `key` | str | **Yes** | – | Column key that **must** exist in every row. |
| `label` | str | No | Same as `key` | Header text displayed in the table. |
| `visible` | bool | No | `true` | If `false`, the column is omitted from header & body. |

### 2.1 Validation Rules

* The list must not contain **duplicate `key` values**.
* Every `key` **must** match a property present in the overview data; unknown keys raise a *TableConfigurationError* **before any rendering starts**.
* `visible` missing → treated as `true` (spec default).

---

## 3  `default_sort`

A list of sort-key strings complying with the grammar defined in [Table Sorting](./spec_table_sorting.md#1-sort-key-definition).  
They are evaluated left-to-right when no CLI/ENV override is supplied.

Validation occurs via the sort-utilities module:

* Unknown columns or unsortable virtual columns raise *SortConfigurationError*.
* If omitted, the application falls back to `repo:asc` (repository name ascending).

---

## 4  `group_notes`

Optional mapping controlling the informational paragraph appended **after** each group table (see rendering spec §5):

```yaml
# Example structure
group_notes:
  default: "Note shown for groups without specific override."
  groups:
    alpha-group: "Alpha specific note."
    beta-group: "Beta specific note."
```

| Sub-Key | Type | Required | Meaning |
|---------|------|----------|---------|
| `default` | str | No | Note used for groups *not* listed under `groups`. May be empty. |
| `groups` | mapping | No | Explicit overrides `group-name → note`. |

When absent entirely, no notes are rendered.

---

## 5  Error Handling Summary

| Condition | Raised Exception | Origin |
|-----------|------------------|--------|
| `columns` key missing | `TableConfigurationError` | `validate_column_configuration` |
| Duplicate or unknown column `key` | `TableConfigurationError` | idem |
| Invalid `default_sort` entry (unknown column, bad direction) | `SortConfigurationError` | `parse_sort_keys` |
| File path set in `Settings.table_config` does not exist | **Runtime warning** (log) – **not fatal** | `Settings.__init__` |

The application MUST fail fast on configuration errors but remain robust against a *missing* config file by issuing a warning and operating with **built-in defaults**.

---

## 6  Testing Requirements

1. **Positive Cases** – snapshot tests must include at least one valid `table_config.yaml` verifying:
   * Column order & labels propagate to rendered Markdown.
   * Invisible columns are omitted.
   * `default_sort` influences sort order when no CLI override is present.
2. **Negative Cases** – unit tests must assert that misconfigurations raise the correct exceptions (see table above).
3. **Integration** – approval tests covering the full pipeline (`OverviewData → table → Markdown/Quarto`) must pass with the gold-standard `table_config.yaml` located at project root.

---

## 7  Non-Goals

* The spec does not mandate the location of the YAML file except that its path is provided via `Settings.table_config` (defaulting to `table_config.yaml` in the working directory).
* Styling of the rendered table (HTML/CSS) is out of scope.
* Runtime overrides (CLI `--columns`, etc.) are beyond this document.
