Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
edcd182
feat!: Add support for rolling back migrations
ElijahAhianyo Jun 2, 2026
d069460
add unit tests
ElijahAhianyo Jun 4, 2026
965f482
chore(pre-commit.ci): auto fixes from pre-commit hooks
pre-commit-ci[bot] Jun 4, 2026
851faff
clippy fix
ElijahAhianyo Jun 4, 2026
921ef7b
chore(pre-commit.ci): auto fixes from pre-commit hooks
pre-commit-ci[bot] Jun 4, 2026
4b90c80
Merge branch 'master' into elijah/migrations-rollback
ElijahAhianyo Jun 4, 2026
45ed531
fix doc tests
ElijahAhianyo Jun 5, 2026
92564de
update lock
ElijahAhianyo Jun 8, 2026
6b4176d
Merge branch 'master' into elijah/migrations-rollback
ElijahAhianyo Jun 9, 2026
787f31a
remove unwanted test
ElijahAhianyo Jun 9, 2026
d5445b9
fix linting
ElijahAhianyo Jun 9, 2026
d16c593
shorten test name so mysql runs
ElijahAhianyo Jun 9, 2026
aa5472c
add some more comments and docs
ElijahAhianyo Jun 9, 2026
eeb4a62
refactor function name
ElijahAhianyo Jun 15, 2026
4978351
address low-hanging fruits in PR comments
ElijahAhianyo Jun 25, 2026
65e48e7
Merge branch 'master' into elijah/migrations-rollback
ElijahAhianyo Jun 25, 2026
99da125
remove unused dep
ElijahAhianyo Jun 25, 2026
b34f193
- add dry run
ElijahAhianyo Jun 29, 2026
fd959a5
Merge branch 'master' into elijah/migrations-rollback
ElijahAhianyo Jul 15, 2026
982e83e
Snapshot test for migration rollback dry run
ElijahAhianyo Jul 17, 2026
197bd5d
move snapshot testing into tests module
ElijahAhianyo Jul 17, 2026
5e8c26b
Merge branch 'master' into elijah/migrations-rollback
ElijahAhianyo Jul 17, 2026
ac361ea
add logs to rollback cli and some refactor
ElijahAhianyo Jul 17, 2026
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
3 changes: 2 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion cot-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ path = "src/main.rs"
workspace = true

[dependencies]
anstyle.workspace = true
anyhow.workspace = true
cargo_toml.workspace = true
chrono.workspace = true
Expand Down
3 changes: 2 additions & 1 deletion cot-cli/src/migration_generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use std::path::{Path, PathBuf};

use anyhow::{Context, bail};
use cot::db::migrations::{DynMigration, MigrationEngine};
use cot::utils::cli::{StatusType, print_status_msg};
use cot_codegen::model::{Field, Model, ModelArgs, ModelOpts, ModelType};
use cot_codegen::symbol_resolver::SymbolResolver;
use darling::FromMeta;
Expand All @@ -18,7 +19,7 @@ use quote::{ToTokens, format_ident, quote};
use syn::{Meta, parse_quote};
use tracing::{debug, trace};

use crate::utils::{CargoTomlManager, PackageManager, StatusType, print_status_msg};
use crate::utils::{CargoTomlManager, PackageManager};

pub fn make_migrations(path: &Path, options: MigrationGeneratorOptions) -> anyhow::Result<()> {
let Some(manager) = CargoTomlManager::from_path(path)? else {
Expand Down
3 changes: 1 addition & 2 deletions cot-cli/src/new_project.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
use std::path::Path;

use cot::utils::cli::{StatusType, print_status_msg};
use heck::ToPascalCase;
use rand::rngs::{StdRng, SysRng};
use rand::{Rng, SeedableRng};
use tracing::trace;

use crate::utils::{StatusType, print_status_msg};

macro_rules! project_file {
($name:literal) => {
($name, include_str!(concat!("project_template/", $name)))
Expand Down
69 changes: 0 additions & 69 deletions cot-cli/src/utils.rs
Original file line number Diff line number Diff line change
@@ -1,78 +1,9 @@
use std::collections::HashMap;
use std::path::{Path, PathBuf};

use anstyle::{AnsiColor, Color, Effects, Style};
use anyhow::{Context, bail};
use cargo_toml::Manifest;

pub(crate) fn print_status_msg(status: StatusType, message: &str) {
let style = status.style();
let status_str = status.as_str();

eprintln!("{style}{status_str:>12}{style:#} {message}");
}

#[derive(Debug, Clone, Copy)]
pub(crate) enum StatusType {
// In-Progress Ops
Creating,
Adding,
Modifying,
Removing,
// Completed Ops
Created,
Added,
Modified,
Removed,

// Status types
#[expect(dead_code)]
Error, // Should be used in Error handling inside remove operations
#[expect(dead_code)]
Warning, // Should be used as cautionary messages.
Notice,
}

impl StatusType {
fn style(self) -> Style {
let base_style = Style::new() | Effects::BOLD;

match self {
// In-Progress => Brighter colors
StatusType::Creating => base_style.fg_color(Some(Color::Ansi(AnsiColor::BrightGreen))),
StatusType::Adding => base_style.fg_color(Some(Color::Ansi(AnsiColor::BrightCyan))),
StatusType::Removing => {
base_style.fg_color(Some(Color::Ansi(AnsiColor::BrightMagenta)))
}
StatusType::Modifying => base_style.fg_color(Some(Color::Ansi(AnsiColor::BrightBlue))),
// Completed => Dimmed colors
StatusType::Created => base_style.fg_color(Some(Color::Ansi(AnsiColor::Green))),
StatusType::Added => base_style.fg_color(Some(Color::Ansi(AnsiColor::Cyan))),
StatusType::Removed => base_style.fg_color(Some(Color::Ansi(AnsiColor::Magenta))),
StatusType::Modified => base_style.fg_color(Some(Color::Ansi(AnsiColor::Blue))),
// Status types
StatusType::Warning => base_style.fg_color(Some(Color::Ansi(AnsiColor::Yellow))),
StatusType::Error => base_style.fg_color(Some(Color::Ansi(AnsiColor::Red))),
StatusType::Notice => base_style.fg_color(Some(Color::Ansi(AnsiColor::White))),
}
}
fn as_str(self) -> &'static str {
match self {
StatusType::Creating => "Creating",
StatusType::Adding => "Adding",
StatusType::Modifying => "Modifying",
StatusType::Removing => "Removing",
StatusType::Created => "Created",
StatusType::Added => "Added",
StatusType::Modified => "Modified",
StatusType::Removed => "Removed",
StatusType::Warning => "Warning",
StatusType::Error => "Error",
StatusType::Notice => "Notice",
}
}
}

#[derive(Debug)]
pub(crate) enum CargoTomlManager {
Workspace(WorkspaceManager),
Expand Down
4 changes: 3 additions & 1 deletion cot/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@ workspace = true

[dependencies]
aide = { workspace = true, optional = true }
anstyle.workspace = true
askama = { workspace = true, features = ["std"] }
async-trait.workspace = true
axum = { workspace = true, features = ["http1", "tokio"] }
blake3.workspace = true
bytes.workspace = true
chrono = { workspace = true, features = ["alloc", "serde", "clock"] }
chrono-tz.workspace = true
clap.workspace = true
clap = {workspace = true, features = ["string"] }
cot_core.workspace = true
cot_macros.workspace = true
deadpool-redis = { workspace = true, features = ["tokio-comp", "rt_tokio_1"], optional = true }
Expand Down Expand Up @@ -72,6 +73,7 @@ url = { workspace = true, features = ["serde"] }
criterion = { workspace = true, features = ["async_tokio"] }
fake.workspace = true
fantoccini.workspace = true
insta.workspace = true
mockall.workspace = true
reqwest = { workspace = true, features = ["json"] }
rustversion.workspace = true
Expand Down
Loading
Loading