sapp/warning_messages.py (45 lines of code) (raw):
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
# pyre-strict
import json
import logging
from pathlib import Path
from sqlalchemy import Table
from sqlalchemy.engine import Connection
from . import models
from .db import DB
from .models import WarningMessage
log: logging.Logger = logging.getLogger()
def upsert_entry(
    database_connection: Connection,
    warning_messages_table: Table,
    code: int,
    message: str,
) -> None:
    warning = database_connection.execute(
        warning_messages_table.select().where(warning_messages_table.c.code == code)
    ).first()
    if warning and warning.message != message:
        database_connection.execute(
            warning_messages_table.update()
            .where(warning_messages_table.c.code == code)
            .values(message=message)
        )
        log.info(f"Updated - {code}: {message}")
    elif not warning:
        database_connection.execute(
            warning_messages_table.insert().values(code=code, message=message)
        )
        log.info(f"Added - {code}: {message}")
def update_warning_messages(database: DB, metadata_file: Path) -> None:
    warning_messages_from_metadata_file = json.loads(metadata_file.read_text())["codes"]
    warning_messages = {
        int(code): message
        for code, message in warning_messages_from_metadata_file.items()
    }
    # TODO(T89343050)
    models.create(database)
    warning_messages_table = Table(
        WarningMessage.__tablename__, WarningMessage.metadata
    )
    with database.make_session() as session:
        with session.connection() as database_connection:
            for code, message in warning_messages.items():
                upsert_entry(database_connection, warning_messages_table, code, message)
            session.commit()