Files
euchre_camp/scripts/python/generate_games.py
T
david 501e1b7e23
Release / release (push) Failing after 1m9s
Test / unit-tests (push) Successful in 2m5s
fix: version bumping and Docker registry authentication (#17)
## Summary

This PR fixes the release workflow to properly handle version bumping on PR merge and uses the new Docker registry authentication secrets.

## Changes

### Release Workflow (release.yml)
- **Version Bumping**: Now automatically bumps version on PR merge
  - Determines bump type from commit messages (major/minor/patch)
  - Commits version bump to `package.json` and `CHANGELOG.md`
  - Creates git tag for the release
- **Docker Registry Auth**: Uses `DOCKER_LOGIN` and `DOCKER_PASSWORD` secrets
  - Falls back gracefully if secrets are not configured
- **Tag Handling**: Checks if tag exists before creating (prevents failures)

### PR Workflow (pr.yml) - NEW
- Runs unit tests on every PR
- Analyzes commits to suggest bump type
- Comments the suggested bump type on the PR

### Documentation
- Added `WORKFLOW_ARCHITECTURE.md` explaining the workflow design

## Workflow Architecture

**Two-step process:**
1. **PR Workflow** (on PR): Analyzes commits and suggests bump type
2. **Release Workflow** (on merge): Bumps version, creates tag, builds Docker image

## Benefits

1. **No CI Loops**: Version bump commits are detected and skipped
2. **Clear Communication**: PR comments inform developers of version impact
3. **Semantic Versioning**: Automated adherence to semver rules
4. **Traceability**: Git tags and changelog reflect all changes

## Testing

The new workflows will be tested when this PR is merged.

Closes #13 (Add database test safety configuration)

Reviewed-on: #17
Co-authored-by: David Gwilliam <dhgwilliam@gmail.com>
Co-committed-by: David Gwilliam <dhgwilliam@gmail.com>
2026-04-01 05:03:14 +00:00

139 lines
3.8 KiB
Python

#!/usr/bin/env python3
"""
Generate 100+ games to test ELO rating calculations
"""
import sqlite3
import random
from datetime import datetime, timedelta
DB_PATH = "prisma/prisma/dev.db"
def get_players():
"""Get all players from the database"""
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute("SELECT id, name, currentElo FROM players")
players = cursor.fetchall()
conn.close()
return players
def generate_game(players, game_num, base_date):
"""Generate a single game with random players and scores"""
# Randomly select 4 different players
selected_players = random.sample(players, 4)
p1, p2, p3, p4 = selected_players
# Randomly assign teams (Team 1 vs Team 2)
team1_p1 = p1
team1_p2 = p2
team2_p1 = p3
team2_p2 = p4
# Generate realistic scores (Euchre games typically 10 points max)
# Team 1 wins 60% of the time for variety
team1_wins = random.random() < 0.6
if team1_wins:
# Team 1 wins - generate scores
team1_score = random.randint(10, 15)
team2_score = random.randint(0, 9)
else:
# Team 2 wins - generate scores
team2_score = random.randint(10, 15)
team1_score = random.randint(0, 9)
# Generate random date in the past 30 days
days_ago = random.randint(0, 30)
game_date = base_date - timedelta(
days=days_ago, hours=random.randint(0, 23), minutes=random.randint(0, 59)
)
return {
"team1P1Id": team1_p1[0],
"team1P2Id": team1_p2[0],
"team2P1Id": team2_p1[0],
"team2P2Id": team2_p2[0],
"team1Score": team1_score,
"team2Score": team2_score,
"playedAt": game_date.isoformat() + "Z",
"status": "completed",
"eventId": None,
}
def insert_games(games):
"""Insert games into the database"""
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
for game in games:
cursor.execute(
"""
INSERT INTO matches
(team1P1Id, team1P2Id, team2P1Id, team2P2Id, team1Score, team2Score, playedAt, status, eventId, createdAt, updatedAt)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
(
game["team1P1Id"],
game["team1P2Id"],
game["team2P1Id"],
game["team2P2Id"],
game["team1Score"],
game["team2Score"],
game["playedAt"],
game["status"],
game["eventId"],
datetime.now().isoformat() + "Z",
datetime.now().isoformat() + "Z",
),
)
conn.commit()
conn.close()
def main():
print("Generating 150 games to test ELO ratings...")
print("=" * 60)
players = get_players()
print(f"Found {len(players)} players in database")
# Generate 150 games
num_games = 150
base_date = datetime.now()
games = []
for i in range(num_games):
game = generate_game(players, i, base_date)
games.append(game)
print(f"Generated {len(games)} games")
# Insert games into database
print("Inserting games into database...")
insert_games(games)
print("Games inserted successfully!")
# Show sample games
print("\nSample games:")
print("-" * 80)
for i, game in enumerate(games[:3]):
print(
f"Game {i + 1}: Team 1 ({game['team1Score']}) vs Team 2 ({game['team2Score']})"
)
print(f" Team 1: Player {game['team1P1Id']} + Player {game['team1P2Id']}")
print(f" Team 2: Player {game['team2P1Id']} + Player {game['team2P2Id']}")
print(f" Date: {game['playedAt']}")
print()
print("=" * 60)
print(f"Total games generated: {num_games}")
print("Now check the ELO ratings by running the application!")
if __name__ == "__main__":
main()