Skip to content

Commit 08c02e9

Browse files
committed
Add running with docker compose.
1 parent b460b5f commit 08c02e9

File tree

6 files changed

+103
-20
lines changed

6 files changed

+103
-20
lines changed

config.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from functools import lru_cache
2+
from typing import Optional
3+
4+
from pydantic_settings import BaseSettings, SettingsConfigDict
5+
6+
7+
class BaseConfig(BaseSettings):
8+
ENV_STATE: Optional[str] = None
9+
10+
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
11+
12+
13+
class GlobalConfig(BaseConfig):
14+
DATABASE_URL: Optional[str] = None
15+
DB_FORCE_ROLL_BACK: bool = False
16+
MAILGUN_DOMAIN: Optional[str] = None
17+
MAILGUN_API_KEY: Optional[str] = None
18+
REDIS_URL: Optional[str] = None
19+
20+
21+
class DevConfig(GlobalConfig):
22+
model_config = SettingsConfigDict(env_prefix="DEV_", extra="ignore")
23+
24+
25+
class ProdConfig(GlobalConfig):
26+
model_config = SettingsConfigDict(env_prefix="PROD_", extra="ignore")
27+
28+
29+
class TestConfig(GlobalConfig):
30+
DATABASE_URL: str = "sqlite:///test.db"
31+
DB_FORCE_ROLL_BACK: bool = True
32+
REDIS_URL: str = ""
33+
34+
model_config = SettingsConfigDict(env_prefix="TEST_", extra="ignore")
35+
36+
37+
@lru_cache()
38+
def get_config(env_state: str):
39+
configs = {"dev": DevConfig, "prod": ProdConfig, "test": TestConfig}
40+
return configs[env_state]()
41+
42+
43+
config = get_config(BaseConfig().ENV_STATE)

docker-compose.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
services:
2+
web:
3+
build: .
4+
ports:
5+
- "5000:80"
6+
depends_on:
7+
db:
8+
condition: service_healthy
9+
redis:
10+
condition: service_started
11+
env_file:
12+
- ./.env
13+
volumes:
14+
- .:/app
15+
db:
16+
image: postgres
17+
environment:
18+
- POSTGRES_PASSWORD=password
19+
- POSTGRES_DB=myapp
20+
volumes:
21+
- postgres_data:/var/lib/postgresql/data
22+
healthcheck:
23+
test: pg_isready -d $${POSTGRES_DB} -U postgres
24+
interval: 2s
25+
retries: 10
26+
redis:
27+
image: redis:alpine
28+
rq_worker:
29+
build: .
30+
depends_on:
31+
- redis
32+
env_file:
33+
- ./.env
34+
volumes:
35+
- .:/app
36+
command: /bin/bash -c "cd /app && rq worker -c settings"
37+
volumes:
38+
postgres_data:

requirements-dev.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
pytest
22
black
3-
flake8
3+
flake8
4+
fakeredis

requirements.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ gunicorn
99
redis
1010
rq
1111
psycopg2
12-
requests
12+
requests
13+
pydantic
14+
pydantic_settings

resources/user.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,28 @@
1-
import os
1+
22
import redis
33
from flask.views import MethodView
4+
from flask_jwt_extended import (create_access_token, create_refresh_token,
5+
get_jwt, get_jwt_identity, jwt_required)
46
from flask_smorest import Blueprint, abort
5-
from flask_jwt_extended import (
6-
create_access_token,
7-
create_refresh_token,
8-
get_jwt_identity,
9-
get_jwt,
10-
jwt_required,
11-
)
127
from passlib.hash import pbkdf2_sha256
13-
from sqlalchemy import or_
148
from rq import Queue
9+
from sqlalchemy import or_
1510

16-
from tasks import send_user_registration_email
17-
11+
import config
12+
from blocklist import BLOCKLIST
1813
from db import db
1914
from models import UserModel
20-
from schemas import UserSchema, UserRegisterSchema
21-
from blocklist import BLOCKLIST
15+
from schemas import UserRegisterSchema, UserSchema
16+
from tasks import send_user_registration_email
2217

2318
blp = Blueprint("Users", "users", description="Operations on users")
24-
connection = redis.from_url(
25-
os.getenv("REDIS_URL")
26-
) # Get this from Render.com or run in Docker
27-
queue = Queue("emails", connection=connection)
19+
if isinstance(config.config, config.TestConfig):
20+
import fakeredis
21+
connection = fakeredis.FakeStrictRedis()
22+
queue = Queue("emails", is_async=False, connection=connection)
23+
else:
24+
connection = redis.from_url(config.config.REDIS_URL)
25+
queue = Queue("emails", connection=connection)
2826

2927

3028
@blp.route("/register")

settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import os
2+
import config
23
from dotenv import load_dotenv
34

45
load_dotenv()
56

6-
REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379")
7+
REDIS_URL = config.config.REDIS_URL
78
QUEUES = ["emails", "default"]

0 commit comments

Comments
 (0)