Skip to content

Commit 1f083d7

Browse files
committed
packages updated
1 parent 0d3acd8 commit 1f083d7

3 files changed

Lines changed: 128 additions & 37 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ __pycache__/
1414
venv/
1515
ENV/
1616
env/
17+
*.env
1718

1819
# IDEs
1920
.vscode/

app/seed.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
from sqlmodel import Session, select
2+
from models import User, Post, Vote
3+
from utils import get_password_hash
4+
from faker import Faker
5+
from sqlalchemy.exc import IntegrityError
6+
from database import engine # your SQLModel engine setup
7+
import random
8+
9+
fake = Faker()
10+
11+
USER_NAMES = [
12+
"Alice", "Bob", "Charlie", "Diana", "Ethan", "Fiona", "George", "Hannah", "Ivan", "Jasmine"
13+
]
14+
15+
NUM_POSTS_PER_USER = 3
16+
NUM_VOTES = 20
17+
18+
19+
def seed_users(session: Session):
20+
users = []
21+
for name in USER_NAMES:
22+
email = f"{name.lower()}@gmail.com"
23+
existing_user = session.exec(
24+
select(User).where(User.email == email)).first()
25+
if existing_user:
26+
continue
27+
hashed_password = get_password_hash("password123")
28+
user = User(
29+
email=email,
30+
password=hashed_password # You might want to hash in real apps
31+
)
32+
session.add(user)
33+
session.commit()
34+
session.refresh(user)
35+
users.append(user)
36+
37+
return users
38+
39+
40+
def seed_posts(session: Session, users):
41+
posts = []
42+
for user in users:
43+
for _ in range(NUM_POSTS_PER_USER):
44+
post = Post(
45+
title=fake.sentence(nb_words=6),
46+
content=fake.paragraph(nb_sentences=3),
47+
owner_id=user.id,
48+
published=random.choice([True, False])
49+
)
50+
session.add(post)
51+
session.commit()
52+
session.refresh(post)
53+
posts.append(post)
54+
return posts
55+
56+
57+
def seed_votes(session: Session, users, posts):
58+
for _ in range(NUM_VOTES):
59+
user = random.choice(users)
60+
post = random.choice(posts)
61+
62+
# Avoid duplicate votes
63+
existing_vote = session.exec(
64+
select(Vote).where(Vote.user_id ==
65+
user.id, Vote.post_id == post.id)
66+
).first()
67+
68+
if not existing_vote:
69+
vote = Vote(user_id=user.id, post_id=post.id)
70+
session.add(vote)
71+
72+
session.commit()
73+
74+
75+
def main():
76+
with Session(engine) as session:
77+
print("🌱 Seeding users...")
78+
users = seed_users(session)
79+
80+
print("📝 Seeding posts...")
81+
posts = seed_posts(session, users)
82+
83+
print("👍 Seeding votes...")
84+
seed_votes(session, users, posts)
85+
86+
print("✅ Seeding completed.")
87+
88+
89+
if __name__ == "__main__":
90+
main()

requirements.txt

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
alembic==1.15.2
1+
alembic==1.16.4
22
annotated-types==0.7.0
3-
anyio==4.9.0
4-
Authlib==1.5.2
5-
bcrypt==4.0.1
3+
anyio==4.10.0
4+
Authlib==1.6.2
5+
bcrypt==4.3.0
66
bleach==6.2.0
7-
certifi==2025.4.26
7+
certifi==2025.8.3
88
cffi==1.17.1
9-
charset-normalizer==3.4.2
10-
click==8.1.8
9+
charset-normalizer==3.4.3
10+
click==8.2.1
1111
colorama==0.4.6
12-
cryptography==44.0.3
12+
cryptography==45.0.6
1313
dnspython==2.7.0
1414
dparse==0.6.4
1515
email_validator==2.2.0
16-
fastapi==0.115.12
17-
fastapi-cli==0.0.7
16+
fastapi==0.116.1
17+
fastapi-cli==0.0.8
1818
filelock==3.16.1
19-
greenlet==3.2.1
19+
greenlet==3.2.4
2020
gunicorn==23.0.0
2121
h11==0.16.0
2222
httpcore==1.0.9
@@ -26,54 +26,54 @@ idna==3.10
2626
iniconfig==2.1.0
2727
itsdangerous==2.2.0
2828
Jinja2==3.1.6
29-
joblib==1.5.0
29+
joblib==1.5.1
3030
Mako==1.3.10
31-
markdown-it-py==3.0.0
31+
markdown-it-py==4.0.0
3232
MarkupSafe==3.0.2
3333
marshmallow==4.0.0
3434
mdurl==0.1.2
3535
nltk==3.9.1
36-
orjson==3.10.16
36+
orjson==3.11.2
3737
packaging==25.0
3838
passlib==1.7.4
39-
pluggy==1.5.0
39+
pluggy==1.6.0
4040
psutil==6.1.1
4141
psycopg2==2.9.10
4242
pycparser==2.22
4343
pydantic==2.9.2
44-
pydantic-extra-types==2.10.3
45-
pydantic-settings==2.9.1
44+
pydantic-extra-types==2.10.5
45+
pydantic-settings==2.10.1
4646
pydantic_core==2.23.4
47-
Pygments==2.19.1
47+
Pygments==2.19.2
4848
PyJWT==2.10.1
49-
pytest==8.3.5
50-
python-dotenv==1.1.0
49+
pytest==8.4.1
50+
python-dotenv==1.1.1
5151
python-multipart==0.0.20
5252
PyYAML==6.0.2
53-
regex==2024.11.6
54-
requests==2.32.3
55-
rich==14.0.0
56-
rich-toolkit==0.14.3
57-
ruamel.yaml==0.18.10
53+
regex==2025.7.34
54+
requests==2.32.5
55+
rich==14.1.0
56+
rich-toolkit==0.15.0
57+
ruamel.yaml==0.18.15
5858
ruamel.yaml.clib==0.2.12
59-
safety==3.4.0
59+
safety==3.6.0
6060
safety-schemas==0.0.14
61-
setuptools==80.3.1
61+
setuptools==80.9.0
6262
shellingham==1.5.4
6363
sniffio==1.3.1
64-
SQLAlchemy==2.0.40
64+
SQLAlchemy==2.0.43
6565
sqlmodel==0.0.24
66-
starlette==0.46.2
66+
starlette==0.47.3
6767
tenacity==9.1.2
68-
tomlkit==0.13.2
68+
tomlkit==0.13.3
6969
tqdm==4.67.1
70-
typer==0.15.2
71-
typing-inspection==0.4.0
72-
typing_extensions==4.13.2
73-
ujson==5.10.0
74-
urllib3==2.4.0
75-
uvicorn==0.34.2
76-
watchfiles==1.0.5
70+
typer==0.16.1
71+
typing-inspection==0.4.1
72+
typing_extensions==4.15.0
73+
ujson==5.11.0
74+
urllib3==2.5.0
75+
uvicorn==0.35.0
76+
watchfiles==1.1.0
7777
webencodings==0.5.1
7878
websockets==15.0.1
7979
wheel==0.45.1

0 commit comments

Comments
 (0)