# deolinjaffens/datarecon architecture

> Architecture diagram of the GitHub repository deolinjaffens/datarecon, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/deolinjaffens/datarecon
- Repository: https://github.com/deolinjaffens/datarecon

## Overview

DataRecon is a desktop application for comparing two CSV, XLSX, or JSON files. The user selects both files, chooses matching keys (or uses all common columns), runs a comparison, then reviews schema differences and record classifications in column or JSON form. The service routes each input to its format-specific loader and invokes the comparison domain, which normalizes columns, pairs records, and classifies differences. UI excerpts are partial; the graph omits uncertain internal UI wiring and shows only documented or sampled interactions.

Main entry points: [`datarecon/ui/main_window.py`](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/ui/main_window.py) (Main window), [`datarecon/application/comparison_service.py`](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/application/comparison_service.py) (Comparison service), [`datarecon/domain/comparison.py`](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/domain/comparison.py) (Comparison engine), [`datarecon/infrastructure/csv_processor.py`](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/infrastructure/csv_processor.py) (CSV reader)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Desktop UI"]
  node_window["Main window<br/>[main_window.py]"]
  node_key_choice["Key selection<br/>[main_window.py]"]
  node_schema_view["Schema tab<br/>[main_window.py]"]
  node_record_view["Record views<br/>[main_window.py]"]
end

subgraph group_app["Application"]
  node_service["Comparison service"]
end

subgraph group_ingest["File Readers"]
  node_csv_reader["CSV reader<br/>[csv_processor.py]"]
  node_excel_reader["Excel reader<br/>[excel_processor.py]"]
  node_json_reader["JSON reader<br/>[json_processor.py]"]
end

subgraph group_domain["Comparison Domain"]
  node_engine["Comparison engine<br/>[comparison.py]"]
  node_schema["Schema analysis<br/>[comparison.py]"]
  node_matching["Record matching<br/>[comparison.py]"]
  node_classification["Record classification<br/>[comparison.py]"]
end

node_user(("User"))
node_file_a["File A"]
node_file_b["File B"]

node_user -->|"uses"| node_window
node_file_a -->|"selects"| node_window
node_file_b -->|"selects"| node_window
node_window -->|"configures"| node_key_choice
node_window -->|"loads files"| node_service
node_service -->|"dispatches CSV"| node_csv_reader
node_service -->|"dispatches XLSX"| node_excel_reader
node_service -->|"dispatches JSON"| node_json_reader
node_file_a -->|"read by"| node_csv_reader
node_file_b -->|"read by"| node_csv_reader
node_file_a -->|"read by"| node_excel_reader
node_file_b -->|"read by"| node_excel_reader
node_file_a -->|"read by"| node_json_reader
node_file_b -->|"read by"| node_json_reader
node_csv_reader -->|"returns records"| node_service
node_excel_reader -->|"returns records"| node_service
node_json_reader -->|"returns records"| node_service
node_window -->|"runs comparison"| node_service
node_service -->|"compares datasets"| node_engine
node_key_choice -->|"provides keys"| node_window
node_engine -->|"derives columns"| node_schema
node_engine -->|"pairs records"| node_matching
node_matching -->|"classifies pairs"| node_classification
node_engine -->|"collects unmatched"| node_classification
node_schema -->|"returns schema"| node_window
node_classification -->|"returns results"| node_window
node_window -->|"renders"| node_schema_view
node_window -->|"renders"| node_record_view
node_user -->|"chooses format"| node_record_view

click node_window "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/ui/main_window.py"
click node_key_choice "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/ui/main_window.py"
click node_schema_view "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/ui/main_window.py"
click node_record_view "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/ui/main_window.py"
click node_service "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/application/comparison_service.py"
click node_csv_reader "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/infrastructure/csv_processor.py"
click node_excel_reader "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/infrastructure/excel_processor.py"
click node_json_reader "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/infrastructure/json_processor.py"
click node_engine "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/domain/comparison.py"
click node_schema "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/domain/comparison.py"
click node_matching "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/domain/comparison.py"
click node_classification "https://github.com/deolinjaffens/datarecon/blob/main/datarecon/domain/comparison.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_window,node_key_choice,node_schema_view,node_record_view,node_user toneBlue
class node_service toneAmber
class node_csv_reader,node_excel_reader,node_json_reader toneMint
class node_engine,node_schema,node_matching,node_classification toneRose
class node_file_a,node_file_b toneIndigo
```

## Components

### Desktop UI

- [Main window](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/ui/main_window.py): `datarecon/ui/main_window.py`
- [Key selection](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/ui/main_window.py): `datarecon/ui/main_window.py`
- [Schema tab](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/ui/main_window.py): `datarecon/ui/main_window.py`
- [Record views](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/ui/main_window.py): `datarecon/ui/main_window.py`

### Application

- [Comparison service](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/application/comparison_service.py): `datarecon/application/comparison_service.py`

### File Readers

- [CSV reader](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/infrastructure/csv_processor.py): `datarecon/infrastructure/csv_processor.py`
- [Excel reader](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/infrastructure/excel_processor.py): `datarecon/infrastructure/excel_processor.py`
- [JSON reader](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/infrastructure/json_processor.py): `datarecon/infrastructure/json_processor.py`

### Comparison Domain

- [Comparison engine](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/domain/comparison.py): `datarecon/domain/comparison.py`
- [Schema analysis](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/domain/comparison.py): `datarecon/domain/comparison.py`
- [Record matching](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/domain/comparison.py): `datarecon/domain/comparison.py`
- [Record classification](https://github.com/deolinjaffens/datarecon/blob/main/datarecon/domain/comparison.py): `datarecon/domain/comparison.py`

### Other components

- **User**
- **File A**
- **File B**

## Connections

- User → Main window: uses
- File A → Main window: selects
- File B → Main window: selects
- Main window → Key selection: configures
- Main window → Comparison service: loads files
- Comparison service → CSV reader: dispatches CSV
- Comparison service → Excel reader: dispatches XLSX
- Comparison service → JSON reader: dispatches JSON
- File A → CSV reader: read by
- File B → CSV reader: read by
- File A → Excel reader: read by
- File B → Excel reader: read by
- File A → JSON reader: read by
- File B → JSON reader: read by
- CSV reader → Comparison service: returns records
- Excel reader → Comparison service: returns records
- JSON reader → Comparison service: returns records
- Main window → Comparison service: runs comparison
- Comparison service → Comparison engine: compares datasets
- Key selection → Main window: provides keys
- Comparison engine → Schema analysis: derives columns
- Comparison engine → Record matching: pairs records
- Record matching → Record classification: classifies pairs
- Comparison engine → Record classification: collects unmatched
- Schema analysis → Main window: returns schema
- Record classification → Main window: returns results
- Main window → Schema tab: renders
- Main window → Record views: renders
- User → Record views: chooses format
