numberdivisibilityapi-7cs7rr/generate_sample_data.py
Automated Action 3d02858340 Add divisibility by 3 functionality
- Add is_divisible_by_3 field to database model and schema
- Create migration script for the new field
- Update existing endpoints to check divisibility by 3
- Add dedicated endpoints for divisibility by 3
- Update README with new endpoint documentation
- Fix linting issues with ruff
2025-05-17 15:52:39 +00:00

157 lines
4.7 KiB
Python

import random
import requests
import time
from pathlib import Path
def generate_sample_data(base_url="http://localhost:8000", num_samples=100):
"""
Generate sample data for the divisibility endpoint by making requests to the API.
Args:
base_url (str): Base URL of the API
num_samples (int): Number of sample data points to generate
"""
print(
f"Generating {num_samples} sample data points for the Number Divisibility API..."
)
# Use both GET and POST endpoints to create diverse sample data
for i in range(num_samples):
method = "GET" if i % 2 == 0 else "POST"
number = random.randint(1, 1000) # Generate a random number between 1 and 1000
try:
if method == "GET":
response = requests.get(f"{base_url}/divisibility/{number}")
else:
response = requests.post(
f"{base_url}/divisibility", json={"number": number}
)
if response.status_code == 200:
result = response.json()
print(
f"Added: Number {number} is{'' if result['is_divisible_by_2'] else ' not'} divisible by 2"
)
else:
print(
f"Error: Failed to add number {number}. Status code: {response.status_code}"
)
# Add a small delay to avoid hammering the API
time.sleep(0.1)
except requests.RequestException as e:
print(
f"Error: Failed to connect to API at {base_url}. Make sure the API is running."
)
print(f"Exception: {e}")
return False
print("\nSample data generation completed.")
print(f"Generated {num_samples} data points for the Number Divisibility API.")
print(f"You can view the history at {base_url}/history")
return True
def generate_offline_data(db_path="/app/storage/db/db.sqlite", num_samples=100):
"""
Generate sample data directly to the database without making API requests.
Use this when the API is not running.
Args:
db_path (str): Path to the SQLite database
num_samples (int): Number of sample data points to generate
"""
try:
import sqlite3
db_file = Path(db_path)
# Check if database directory exists
if not db_file.parent.exists():
db_file.parent.mkdir(parents=True, exist_ok=True)
# Connect to the database
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Create table if it doesn't exist
cursor.execute("""
CREATE TABLE IF NOT EXISTS number_checks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
number INTEGER NOT NULL,
is_divisible_by_2 BOOLEAN NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
print(
f"Generating {num_samples} sample data points directly to the database..."
)
# Generate sample data
for i in range(num_samples):
number = random.randint(1, 1000)
is_divisible = number % 2 == 0
cursor.execute(
"INSERT INTO number_checks (number, is_divisible_by_2) VALUES (?, ?)",
(number, is_divisible),
)
print(
f"Added: Number {number} is{'' if is_divisible else ' not'} divisible by 2"
)
# Commit the changes
conn.commit()
conn.close()
print("\nSample data generation completed.")
print(f"Generated {num_samples} data points directly to the database.")
return True
except Exception as e:
print("Error: Failed to generate offline data.")
print(f"Exception: {e}")
return False
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(
description="Generate sample data for the Number Divisibility API"
)
parser.add_argument(
"--samples",
type=int,
default=100,
help="Number of sample data points to generate",
)
parser.add_argument(
"--url", type=str, default="http://localhost:8000", help="Base URL of the API"
)
parser.add_argument(
"--offline",
action="store_true",
help="Generate data directly to the database without API requests",
)
parser.add_argument(
"--db-path",
type=str,
default="/app/storage/db/db.sqlite",
help="Path to the SQLite database file (for offline mode)",
)
args = parser.parse_args()
if args.offline:
generate_offline_data(db_path=args.db_path, num_samples=args.samples)
else:
generate_sample_data(base_url=args.url, num_samples=args.samples)