mirror of
https://github.com/Xevion/linkpulse.git
synced 2026-01-31 06:24:47 -06:00
Improve migrate, responses docs, require min length 9 migration name (validator)
This commit is contained in:
@@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- `logging.py`
|
- `logging.py`
|
||||||
- `models.py`
|
- `models.py`
|
||||||
- `utilities.py`
|
- `utilities.py`
|
||||||
|
- `migrate.py`
|
||||||
|
- `responses.py`
|
||||||
- A `get_db` utility function to retrieve a reference to the database (with type hinting)
|
- A `get_db` utility function to retrieve a reference to the database (with type hinting)
|
||||||
- Minor `DATABASE_URL` check in `models.py` to prevent cryptic connection issues
|
- Minor `DATABASE_URL` check in `models.py` to prevent cryptic connection issues
|
||||||
|
|
||||||
@@ -21,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
- Migration script now uses `structlog` instead of `print`
|
- Migration script now uses `structlog` instead of `print`
|
||||||
- Migration script output is tuned to structlog as well.
|
- Migration script output is tuned to structlog as well.
|
||||||
|
- Migration names must be at least 9 characters long
|
||||||
- Unspecified IPv6 addresses are returned without hiding in `utilities.hide_ip`
|
- Unspecified IPv6 addresses are returned without hiding in `utilities.hide_ip`
|
||||||
- Applied `get_db` utility function in all applicable areas.
|
- Applied `get_db` utility function in all applicable areas.
|
||||||
|
|
||||||
|
|||||||
@@ -130,13 +130,17 @@ def main(*args: str) -> None:
|
|||||||
else:
|
else:
|
||||||
logger.info("No pending migrations to apply.")
|
logger.info("No pending migrations to apply.")
|
||||||
|
|
||||||
|
# Inspects models and might generate a migration script
|
||||||
migration_available = router.show(target_models)
|
migration_available = router.show(target_models)
|
||||||
|
|
||||||
if migration_available is not None:
|
if migration_available is not None:
|
||||||
logger.info("A migration is available to be applied:")
|
logger.info("A migration is available to be applied:")
|
||||||
migrate_text, rollback_text = migration_available
|
migrate_text, rollback_text = migration_available
|
||||||
|
|
||||||
def _reformat_text(text: str) -> str:
|
def _reformat_text(text: str) -> str:
|
||||||
|
# Remove empty lines
|
||||||
text = [line for line in text.split("\n") if line.strip() != ""]
|
text = [line for line in text.split("\n") if line.strip() != ""]
|
||||||
|
# Add line numbers, indent, ensure it starts on a new line
|
||||||
return "\n" + "\n".join([f"{i:02}:\t{line}" for i, line in enumerate(text)])
|
return "\n" + "\n".join([f"{i:02}:\t{line}" for i, line in enumerate(text)])
|
||||||
|
|
||||||
logger.info("Migration Content", content=_reformat_text(migrate_text))
|
logger.info("Migration Content", content=_reformat_text(migrate_text))
|
||||||
@@ -144,11 +148,11 @@ def main(*args: str) -> None:
|
|||||||
|
|
||||||
if questionary.confirm("Do you want to create this migration?").ask():
|
if questionary.confirm("Do you want to create this migration?").ask():
|
||||||
logger.info(
|
logger.info(
|
||||||
'Lowercase letters and underscores only (e.g. "create_table", "remove_ipaddress_count").'
|
'Minimum length 9, lowercase letters and underscores only (e.g. "create_table", "remove_ipaddress_count").'
|
||||||
)
|
)
|
||||||
migration_name: Optional[str] = questionary.text(
|
migration_name: Optional[str] = questionary.text(
|
||||||
"Enter migration name",
|
"Enter migration name",
|
||||||
validate=lambda text: re.match("^[a-z_]+$", text) is not None,
|
validate=lambda text: re.match("^[a-z_]{9,}$", text) is not None,
|
||||||
).ask()
|
).ask()
|
||||||
|
|
||||||
if migration_name is None:
|
if migration_name is None:
|
||||||
@@ -157,6 +161,7 @@ def main(*args: str) -> None:
|
|||||||
migration = router.create(migration_name, auto=target_models)
|
migration = router.create(migration_name, auto=target_models)
|
||||||
if migration:
|
if migration:
|
||||||
logger.info(f"Migration created: {migration}")
|
logger.info(f"Migration created: {migration}")
|
||||||
|
|
||||||
if len(router.diff) == 1:
|
if len(router.diff) == 1:
|
||||||
if questionary.confirm(
|
if questionary.confirm(
|
||||||
"Do you want to apply this migration immediately?"
|
"Do you want to apply this migration immediately?"
|
||||||
@@ -167,8 +172,9 @@ def main(*args: str) -> None:
|
|||||||
"!!! Commit and push this migration file immediately!"
|
"!!! Commit and push this migration file immediately!"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
logger.error("No changes detected. Something went wrong.")
|
raise RuntimeError(
|
||||||
return
|
"Changes anticipated with show() but no migration created with create(), model definition may have reverted."
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
logger.info("No database changes detected.")
|
logger.info("No database changes detected.")
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
"""responses.py
|
||||||
|
|
||||||
|
This module contains the response models for the FastAPI application.
|
||||||
|
"""
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user