Skip to content

Commit b4c6ed0

Browse files
authored
Merge pull request #53 from dev-five-git/export-with-comment
Add comment
2 parents 1cbd31e + bbe1b20 commit b4c6ed0

9 files changed

Lines changed: 140 additions & 5 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"changes":{"crates/vespertide-config/Cargo.toml":"Patch","crates/vespertide-exporter/Cargo.toml":"Patch","crates/vespertide/Cargo.toml":"Patch","crates/vespertide-core/Cargo.toml":"Patch","crates/vespertide-planner/Cargo.toml":"Patch","crates/vespertide-naming/Cargo.toml":"Patch","crates/vespertide-loader/Cargo.toml":"Patch","crates/vespertide-query/Cargo.toml":"Patch","crates/vespertide-macro/Cargo.toml":"Patch","crates/vespertide-cli/Cargo.toml":"Patch"},"note":"Export with comment","date":"2026-01-04T12:23:39.579352900Z"}

crates/vespertide-config/src/config.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,27 @@ impl VespertideConfig {
137137
&self.seaorm
138138
}
139139
}
140+
141+
#[cfg(test)]
142+
mod tests {
143+
use super::*;
144+
145+
#[test]
146+
fn test_vespertide_config_default() {
147+
let config = VespertideConfig::default();
148+
149+
assert_eq!(config.models_dir, PathBuf::from("models"));
150+
assert_eq!(config.migrations_dir, PathBuf::from("migrations"));
151+
assert_eq!(config.table_naming_case, NameCase::Snake);
152+
assert_eq!(config.column_naming_case, NameCase::Snake);
153+
assert_eq!(config.model_format, FileFormat::Json);
154+
assert_eq!(config.migration_format, FileFormat::Json);
155+
assert_eq!(config.migration_filename_pattern, "%04v_%m");
156+
assert_eq!(config.model_export_dir, PathBuf::from("src/models"));
157+
assert_eq!(
158+
config.seaorm.extra_enum_derives,
159+
vec!["vespera::Schema".to_string()]
160+
);
161+
assert!(config.seaorm.extra_model_derives.is_empty());
162+
}
163+
}

crates/vespertide-exporter/src/seaorm/mod.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ pub fn render_entity_with_config(
107107
.collect();
108108
model_derives.extend(extra_model_derives);
109109

110+
// Add table description as doc comment
111+
if let Some(ref desc) = table.description {
112+
for line in desc.lines() {
113+
lines.push(format!("/// {}", line));
114+
}
115+
}
116+
110117
lines.push("#[sea_orm::model]".into());
111118
lines.push(format!("#[derive({})]", model_derives.join(", ")));
112119
lines.push(format!("#[sea_orm(table_name = \"{}\")]", table.name));
@@ -178,6 +185,13 @@ fn render_column(
178185
let is_indexed = indexed_columns.contains(&column.name);
179186
let has_default = column.default.is_some();
180187

188+
// Add column comment as doc comment
189+
if let Some(ref comment) = column.comment {
190+
for line in comment.lines() {
191+
lines.push(format!(" /// {}", line));
192+
}
193+
}
194+
181195
// Build attribute parts
182196
let mut attrs: Vec<String> = Vec::new();
183197

@@ -2854,4 +2868,94 @@ mod tests {
28542868
// Should NOT contain vespera::Schema since we explicitly set empty
28552869
assert!(!result.contains("vespera::Schema"));
28562870
}
2871+
2872+
#[test]
2873+
fn test_doc_comments_from_description_and_comment() {
2874+
use vespertide_core::schema::primary_key::PrimaryKeySyntax;
2875+
2876+
let table = TableDef {
2877+
name: "users".into(),
2878+
description: Some("User account information table".into()),
2879+
columns: vec![
2880+
ColumnDef {
2881+
name: "id".into(),
2882+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
2883+
nullable: false,
2884+
default: None,
2885+
comment: Some("Unique user identifier".into()),
2886+
primary_key: Some(PrimaryKeySyntax::Bool(true)),
2887+
unique: None,
2888+
index: None,
2889+
foreign_key: None,
2890+
},
2891+
ColumnDef {
2892+
name: "email".into(),
2893+
r#type: ColumnType::Simple(SimpleColumnType::Text),
2894+
nullable: false,
2895+
default: None,
2896+
comment: Some("User's email address for login".into()),
2897+
primary_key: None,
2898+
unique: None,
2899+
index: None,
2900+
foreign_key: None,
2901+
},
2902+
ColumnDef {
2903+
name: "name".into(),
2904+
r#type: ColumnType::Simple(SimpleColumnType::Text),
2905+
nullable: true,
2906+
default: None,
2907+
comment: None, // No comment
2908+
primary_key: None,
2909+
unique: None,
2910+
index: None,
2911+
foreign_key: None,
2912+
},
2913+
],
2914+
constraints: vec![],
2915+
};
2916+
2917+
let rendered = render_entity(&table);
2918+
2919+
// Check table description as doc comment
2920+
assert!(rendered.contains("/// User account information table"));
2921+
2922+
// Check column comments as doc comments
2923+
assert!(rendered.contains("/// Unique user identifier"));
2924+
assert!(rendered.contains("/// User's email address for login"));
2925+
2926+
// name column has no comment, so no doc comment for it
2927+
assert!(!rendered.contains("/// name"));
2928+
}
2929+
2930+
#[test]
2931+
fn test_multiline_doc_comments() {
2932+
use vespertide_core::schema::primary_key::PrimaryKeySyntax;
2933+
2934+
let table = TableDef {
2935+
name: "posts".into(),
2936+
description: Some("Blog posts table\nContains all user-submitted content".into()),
2937+
columns: vec![ColumnDef {
2938+
name: "content".into(),
2939+
r#type: ColumnType::Simple(SimpleColumnType::Text),
2940+
nullable: false,
2941+
default: None,
2942+
comment: Some("Post content body\nSupports markdown format".into()),
2943+
primary_key: Some(PrimaryKeySyntax::Bool(true)),
2944+
unique: None,
2945+
index: None,
2946+
foreign_key: None,
2947+
}],
2948+
constraints: vec![],
2949+
};
2950+
2951+
let rendered = render_entity(&table);
2952+
2953+
// Check multiline table description
2954+
assert!(rendered.contains("/// Blog posts table"));
2955+
assert!(rendered.contains("/// Contains all user-submitted content"));
2956+
2957+
// Check multiline column comment
2958+
assert!(rendered.contains("/// Post content body"));
2959+
assert!(rendered.contains("/// Supports markdown format"));
2960+
}
28572961
}

examples/app/models/media.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
"type": "uuid",
88
"nullable": false,
99
"default": "gen_random_uuid()",
10-
"primary_key": true
10+
"primary_key": true,
11+
"comment": "hello"
1112
},
1213
{
1314
"name": "name",

examples/app/models/user_media_role.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/dev-five-git/vespertide/refs/heads/main/schemas/model.schema.json",
33
"name": "user_media_role",
4+
"description": "hello media role",
45
"columns": [
56
{
67
"name": "user_id",
@@ -12,7 +13,8 @@
1213
"on_delete": "cascade"
1314
},
1415
"index": true,
15-
"primary_key": true
16+
"primary_key": true,
17+
"comment": "hello"
1618
},
1719
{
1820
"name": "media_id",

examples/app/src/models/article.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use sea_orm::entity::prelude::*;
22
use serde::{Deserialize, Serialize};
33

4-
#[derive(Debug, Clone, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize)]
4+
#[derive(Debug, Clone, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, vespera::Schema)]
55
#[sea_orm(rs_type = "String", db_type = "Enum", enum_name = "article_status")]
66
pub enum Status {
77
#[sea_orm(string_value = "draft")]

examples/app/src/models/article_user.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use sea_orm::entity::prelude::*;
22
use serde::{Deserialize, Serialize};
33

4-
#[derive(Debug, Clone, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize)]
4+
#[derive(Debug, Clone, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, vespera::Schema)]
55
#[sea_orm(rs_type = "String", db_type = "Enum", enum_name = "article_user_role")]
66
pub enum Role {
77
#[sea_orm(string_value = "lead")]

examples/app/src/models/media.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use serde::{Deserialize, Serialize};
55
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, Serialize, Deserialize)]
66
#[sea_orm(table_name = "media")]
77
pub struct Model {
8+
/// hello
89
#[sea_orm(primary_key, default_value = "gen_random_uuid()")]
910
pub id: Uuid,
1011
pub name: String,

examples/app/src/models/user_media_role.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use sea_orm::entity::prelude::*;
22
use serde::{Deserialize, Serialize};
33

4-
#[derive(Debug, Clone, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize)]
4+
#[derive(Debug, Clone, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, vespera::Schema)]
55
#[sea_orm(rs_type = "String", db_type = "Enum", enum_name = "user_media_role_role")]
66
pub enum Role {
77
#[sea_orm(string_value = "owner")]
@@ -12,10 +12,12 @@ pub enum Role {
1212
Reporter,
1313
}
1414

15+
/// hello media role
1516
#[sea_orm::model]
1617
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, Serialize, Deserialize)]
1718
#[sea_orm(table_name = "user_media_role")]
1819
pub struct Model {
20+
/// hello
1921
#[sea_orm(primary_key)]
2022
pub user_id: Uuid,
2123
#[sea_orm(primary_key)]

0 commit comments

Comments
 (0)