This is an automated email from the ASF dual-hosted git repository.

gstein pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/steve.git


The following commit(s) were added to refs/heads/trunk by this push:
     new d0aa7e9  Use aider/Grok to construct an architecture overview of v3
d0aa7e9 is described below

commit d0aa7e9ab92880217a5a36046faf3eb07d273e4c
Author: Greg Stein <[email protected]>
AuthorDate: Thu Apr 2 11:32:10 2026 -0500

    Use aider/Grok to construct an architecture overview of v3
---
 v3/ARCHITECTURE.md | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 119 insertions(+)

diff --git a/v3/ARCHITECTURE.md b/v3/ARCHITECTURE.md
new file mode 100644
index 0000000..2cff9c6
--- /dev/null
+++ b/v3/ARCHITECTURE.md
@@ -0,0 +1,119 @@
+# Apache STeVe v3 Server Architecture
+
+## Overview
+
+Apache STeVe (Secure Team Voting Engine) v3 is a web-based voting system built 
for the Apache Software Foundation. It provides a secure, anonymous voting 
platform for elections, supporting multiple vote types (e.g., Yes/No/Abstain 
motions and Single Transferable Vote elections). The server is implemented in 
Python using the Quart asynchronous web framework, with a SQLite database 
backend for persistence.
+
+The architecture emphasizes security, modularity, and ease of maintenance. It 
follows a layered design with clear separation of concerns: web handling, 
business logic, data access, and utilities.
+
+## Directory Structure
+
+```
+v3/
+├── server/                    # Main server application
+│   ├── api.py                 # API endpoints (currently minimal)
+│   ├── bin/                   # Command-line utilities
+│   │   ├── load-fakedata.py   # Script to populate test data
+│   │   └── tally.py           # Election tallying and reporting
+│   ├── certs/                 # TLS certificates for HTTPS
+│   ├── config.yaml            # Server configuration (YAML)
+│   ├── docs/                  # Per-issue documentation storage
+│   ├── main.py                # Application entry point
+│   ├── pages.py               # Web page handlers (routes)
+│   ├── static/                # Static assets (CSS, JS, images)
+│   │   ├── css/
+│   │   ├── js/
+│   │   └── favicon.ico
+│   └── templates/             # EZT templates for HTML rendering
+├── steve/                     # Core business logic and data models
+│   ├── crypto.py              # Cryptographic utilities (salts, keys, tokens)
+│   ├── election.py            # Election model and database operations
+│   ├── persondb.py            # Person/PersonDB model for voter management
+│   └── vtypes/                # Vote type implementations
+│       └── __init__.py        # Registry of supported vote types
+└── tests/                     # (Removed in some contexts) Unit tests
+```
+
+## Key Components
+
+### Web Layer (Quart Framework)
+
+- **Framework**: Uses Quart, an asynchronous version of Flask, for handling 
HTTP requests. This allows non-blocking I/O for better performance in I/O-bound 
operations like database queries.
+- **Routing**: Handled in `pages.py` with decorators like `@APP.get('/')`. 
Routes are organized by functionality (e.g., voter pages, admin pages).
+- **Authentication**: Relies on external ASF authentication via 
`asfquart.auth`. Requires committer-level access for most operations.
+- **Templates**: Uses EZT (Easy Template) for server-side rendering. Templates 
are stored in `templates/` and use `[variable]` syntax for substitution. 
Includes includes for headers/footers.
+- **Static Assets**: Served from `static/` directory, including Bootstrap 
CSS/JS, custom CSS, and JavaScript utilities.
+- **Middleware**: Includes session management, CSRF protection (placeholder), 
and flash messages for user feedback.
+
+### Business Logic Layer (`steve/`)
+
+- **Election Model** (`election.py`): Core class `Election` manages election 
lifecycle (creation, opening, closing). Handles issues, votes, and voter 
eligibility. Uses prepared SQL queries for database interactions.
+- **Person Database** (`persondb.py`): Manages voter information (PID, name, 
email). Provides lookup and addition methods.
+- **Cryptography** (`crypto.py`): Handles secure token generation, salts, and 
vote encryption. Uses Argon2 for key derivation.
+- **Vote Types** (`vtypes/`): Modular system for different voting methods 
(e.g., 'yna' for Yes/No/Abstain, 'stv' for Single Transferable Vote). Registry 
in `__init__.py`.
+
+### Data Layer
+
+- **Database**: SQLite for simplicity and portability. Schema includes tables 
for elections, issues, votes, persons, and voter eligibility (mayvote).
+- **Queries**: SQL queries are defined in a separate YAML file (referenced but 
not shown in provided files). Accessed via prepared statements in the 
`Election` class.
+- **Connections**: Database connections are opened per operation or cached in 
the app context. Uses `sqlite3` with row factories for dict-like access.
+
+### Utilities and Scripts (`bin/`)
+
+- **Tallying** (`tally.py`): Command-line tool for processing election 
results. Uses the `Election` class to compute tallies and generate reports.
+- **Data Loading** (`load-fakedata.py`): Populates the database with test data 
for development.
+
+## Code Conventions
+
+### Python Style
+
+- **Imports**: Standard library first, then third-party (e.g., `import 
pathlib`, `import quart`), then local modules. Uses absolute imports within the 
package.
+- **Constants**: All uppercase with underscores (e.g., `FMT_DATE = '%b %d'`). 
No abbreviations unless standard.
+- **Variables**: Snake_case for locals/functions, PascalCase for classes.
+- **Error Handling**: Exceptions are raised for errors (e.g., 
`ElectionNotFound`). No broad try/except blocks; scripts exit on failure.
+- **Logging**: Uses Python's `logging` module. Root logger set to INFO to 
suppress third-party noise. Local loggers (e.g., `_LOGGER`) can be DEBUG. 
F-strings for log messages (e.g., `logger.debug(f"Processing {item}")`).
+- **Async/Await**: Used throughout Quart handlers for non-blocking operations.
+- **Type Hints**: Not used (per project style; avoid unless requested).
+- **Docstrings**: Minimal; not enforced.
+
+### File and Directory Layout
+
+- **Modularity**: Each major component in its own file (e.g., `pages.py` for 
routes, `election.py` for model).
+- **Separation**: Web logic in `server/`, business logic in `steve/`, scripts 
in `bin/`.
+- **Configuration**: YAML for config (`config.yaml`), with defaults in code.
+- **Assets**: Organized by type (CSS, JS) in `static/`.
+- **Templates**: Flat structure in `templates/`, with includes for reuse.
+
+### Database Patterns
+
+- **Prepared Statements**: All SQL uses parameterized queries to prevent 
injection.
+- **Transactions**: Implicit in SQLite; explicit commits for multi-step 
operations.
+- **Schema Evolution**: Not shown; assumes schema is static or handled 
externally.
+- **Joins and Counts**: Queries use JOINs for related data (e.g., voter counts 
via `mayvote` table).
+
+### Security
+
+- **Authentication**: External (ASF OAuth); no local auth.
+- **Authorization**: Role-based (committer, PMC member) via decorators.
+- **Encryption**: Votes are encrypted; keys derived securely.
+- **CSRF**: Placeholder token in forms; not fully implemented.
+- **HTTPS**: Enforced via TLS certificates in `certs/`.
+
+### Development and Deployment
+
+- **Entry Point**: `main.py` with `if __name__ == '__main__'` for standalone, 
ASGI for production.
+- **Configuration**: Loaded from `config.yaml` relative to app directory.
+- **Testing**: Unit tests in `tests/` (removed in some contexts).
+- **Dependencies**: Managed via `uv` (Python package manager); includes Quart, 
asfpy, etc.
+
+## Patterns and Idioms
+
+- **Decorator-Based Loading**: `@load_election` and `@load_election_issue` 
decorators fetch and pass database objects to handlers.
+- **EasyDict Usage**: `edict` from `easydict` for dict-like objects with 
attribute access (e.g., `result.election = election.get_metadata()`).
+- **Template Rendering**: `asfquart.utils.render()` for EZT templates.
+- **Flash Messages**: Session-based user feedback using Quart's flash system.
+- **Stopwatch**: `asfpy.stopwatch.Stopwatch()` for performance monitoring in 
debug mode.
+- **EZT Boolean Flags**: `ezt.boolean()` for conditional rendering in 
templates.
+- **Randomization**: Shuffles candidate lists to avoid bias in STV elections.
+
+This architecture supports scalable, secure voting while remaining 
maintainable and extensible.

Reply via email to