Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 57 additions & 31 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -1,33 +1,59 @@
name: Lint
on: pull_request

on:
pull_request:

jobs:
run-linters:
name: Run linters
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./frontend

steps:
- name: Check out Git repository
uses: actions/checkout@v5

- name: Enable corepack
run: corepack enable

- name: Set up Node.js
uses: actions/setup-node@v5
with:
node-version: 22

# ESLint and Prettier must be in `package.json`
- name: Install Node.js dependencies
run: yarn install

- name: Run linters
uses: wearerequired/lint-action@v2.3.0
with:
eslint: true
eslint_dir: ./frontend
prettier: true
prettier_dir: ./frontend
run-linters:
name: ESLint + Prettier (frontend)
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./frontend

steps:
- name: Check out Git repository
uses: actions/checkout@v5

- name: Set up Node.js
uses: actions/setup-node@v5
with:
node-version: 22

- name: Enable Corepack
run: corepack enable

- name: Install Node.js dependencies
run: yarn install --immutable

- name: Run ESLint
run: yarn lint

- name: Run Prettier format check
run: yarn format

ruff:
name: Ruff (backend)
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./backend

steps:
- name: Check out Git repository
uses: actions/checkout@v5

- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Set up Python
run: uv python install

- name: Install backend dependencies
run: uv sync --group dev

- name: Run Ruff lint check
run: uv run ruff check

- name: Run Ruff format check
run: uv run ruff format --check
5 changes: 2 additions & 3 deletions backend/config/asgi.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
"""
ASGI config for hoagiehelp project.
"""ASGI config for hoagiehelp project.

It exposes the ASGI callable as a module-level variable named ``application``.

Expand All @@ -11,6 +10,6 @@

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")

application = get_asgi_application()
181 changes: 90 additions & 91 deletions backend/config/settings.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
"""
Django settings for hoagiehelp project.
"""Django settings for hoagiehelp project.

Generated by 'django-admin startproject' using Django 5.2.8.

Expand Down Expand Up @@ -37,41 +36,41 @@
# Application definition

INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"rest_framework",
"hoagiehelp",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"rest_framework",
"hoagiehelp",
]

MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]

ROOT_URLCONF = "config.urls"

TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]

WSGI_APPLICATION = "config.wsgi.application"
Expand All @@ -90,79 +89,79 @@
AUTH0_ALGORITHMS = ["RS256"]

REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"hoagiehelp.auth.auth.Auth0JWTAuthentication",
],
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated",
],
"DEFAULT_AUTHENTICATION_CLASSES": [
"hoagiehelp.auth.auth.Auth0JWTAuthentication",
],
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated",
],
}

# Logging
LOGS = os.getenv("LOGS", "False").lower() == "true"
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"standard": {
"format": "{asctime} [{levelname}] {name}: {message}",
"style": "{",
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "standard",
},
},
"root": {
"handlers": ["console"],
"level": "WARNING",
},
"loggers": {
# Your application
"hoagiehelp": {
"level": "DEBUG" if LOGS else "INFO",
"handlers": ["console"],
"propagate": False,
},
# Django internals
"django": {
"level": "INFO",
"handlers": ["console"],
"propagate": False,
},
# SQL queries
"django.db.backends": {
"level": "DEBUG" if LOGS else "WARNING",
"handlers": ["console"],
"propagate": False,
},
# HTTP requests
"django.request": {
"level": "INFO",
"handlers": ["console"],
"propagate": False,
},
},
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"standard": {
"format": "{asctime} [{levelname}] {name}: {message}",
"style": "{",
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "standard",
},
},
"root": {
"handlers": ["console"],
"level": "WARNING",
},
"loggers": {
# Your application
"hoagiehelp": {
"level": "DEBUG" if LOGS else "INFO",
"handlers": ["console"],
"propagate": False,
},
# Django internals
"django": {
"level": "INFO",
"handlers": ["console"],
"propagate": False,
},
# SQL queries
"django.db.backends": {
"level": "DEBUG" if LOGS else "WARNING",
"handlers": ["console"],
"propagate": False,
},
# HTTP requests
"django.request": {
"level": "INFO",
"handlers": ["console"],
"propagate": False,
},
},
}

# Password validation
# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]


Expand Down
Loading
Loading