Use file!() macro to avoid manually defining the name of migration (#736)

* Add `DeriveMigrationName`

* CLI migrate generate without replacing migration name

* Update migrations

* Fixup
This commit is contained in:
Billy Chan 2022-06-29 00:42:59 +08:00 committed by GitHub
parent 75cb269ceb
commit 1054d6451c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 114 additions and 77 deletions

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220120_000001_create_post_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220120_000001_create_post_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220120_000001_create_post_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220101_000001_create_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220120_000001_create_post_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220120_000001_create_post_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220120_000001_create_post_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220120_000001_create_post_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -317,7 +317,7 @@ fn create_new_migration(migration_name: &str, migration_dir: &str) -> Result<(),
let migration_content = let migration_content =
migration_template.replace("m20220101_000001_create_table", migration_name); migration_template.replace("m20220101_000001_create_table", migration_name);
let mut migration_file = fs::File::create(migration_filepath)?; let mut migration_file = fs::File::create(migration_filepath)?;
migration_file.write_all(migration_content.as_bytes())?; migration_file.write_all(migration_template.as_bytes())?;
Ok(()) Ok(())
} }
@ -508,8 +508,6 @@ mod tests {
.join(format!("{}.rs", migration_name)); .join(format!("{}.rs", migration_name));
assert!(migration_filepath.exists()); assert!(migration_filepath.exists());
let migration_content = fs::read_to_string(migration_filepath).unwrap(); let migration_content = fs::read_to_string(migration_filepath).unwrap();
let migration_content =
migration_content.replace(&migration_name, "m20220101_000001_create_table");
assert_eq!( assert_eq!(
&migration_content, &migration_content,
include_str!("../template/migration/src/m20220101_000001_create_table.rs") include_str!("../template/migration/src/m20220101_000001_create_table.rs")

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220101_000001_create_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -0,0 +1,32 @@
use proc_macro2::TokenStream;
use quote::quote;
struct DeriveMigrationName {
ident: syn::Ident,
}
impl DeriveMigrationName {
fn new(input: syn::DeriveInput) -> Self {
let ident = input.ident;
DeriveMigrationName { ident }
}
fn expand(&self) -> TokenStream {
let ident = &self.ident;
quote!(
#[automatically_derived]
impl sea_orm_migration::MigrationName for #ident {
fn name(&self) -> &str {
sea_orm_migration::util::get_file_stem(file!())
}
}
)
}
}
/// Method to derive a MigrationName
pub fn expand_derive_migration_name(input: syn::DeriveInput) -> syn::Result<TokenStream> {
Ok(DeriveMigrationName::new(input).expand())
}

View File

@ -6,6 +6,7 @@ mod entity;
mod entity_model; mod entity_model;
mod from_query_result; mod from_query_result;
mod into_active_model; mod into_active_model;
mod migration;
mod model; mod model;
mod primary_key; mod primary_key;
mod relation; mod relation;
@ -18,6 +19,7 @@ pub use entity::*;
pub use entity_model::*; pub use entity_model::*;
pub use from_query_result::*; pub use from_query_result::*;
pub use into_active_model::*; pub use into_active_model::*;
pub use migration::*;
pub use model::*; pub use model::*;
pub use primary_key::*; pub use primary_key::*;
pub use relation::*; pub use relation::*;

View File

@ -582,6 +582,33 @@ pub fn derive_relation(input: TokenStream) -> TokenStream {
.into() .into()
} }
/// The DeriveMigrationName derive macro will implement `sea_orm_migration::MigrationName` for a migration.
///
/// ### Usage
///
/// ```ignore
/// #[derive(DeriveMigrationName)]
/// pub struct Migration;
/// ```
///
/// The derive macro above will provide following implementation,
/// given the file name is `m20220120_000001_create_post_table.rs`.
///
/// ```ignore
/// impl MigrationName for Migration {
/// fn name(&self) -> &str {
/// "m20220120_000001_create_post_table"
/// }
/// }
/// ```
#[proc_macro_derive(DeriveMigrationName)]
pub fn derive_migration_name(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
derives::expand_derive_migration_name(input)
.unwrap_or_else(Error::into_compile_error)
.into()
}
#[doc(hidden)] #[doc(hidden)]
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn test(_: TokenStream, input: TokenStream) -> TokenStream { pub fn test(_: TokenStream, input: TokenStream) -> TokenStream {

View File

@ -3,6 +3,7 @@ pub mod manager;
pub mod migrator; pub mod migrator;
pub mod prelude; pub mod prelude;
pub mod seaql_migrations; pub mod seaql_migrations;
pub mod util;
pub use manager::*; pub use manager::*;
pub use migrator::*; pub use migrator::*;

View File

@ -7,3 +7,4 @@ pub use sea_orm;
pub use sea_orm::sea_query; pub use sea_orm::sea_query;
pub use sea_orm::sea_query::*; pub use sea_orm::sea_query::*;
pub use sea_orm::DbErr; pub use sea_orm::DbErr;
pub use sea_orm::DeriveMigrationName;

View File

@ -0,0 +1,36 @@
pub fn get_file_stem(path: &str) -> &str {
std::path::Path::new(path)
.file_stem()
.map(|f| f.to_str().unwrap())
.unwrap()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_file_stem() {
let pair = vec![
(
"m20220101_000001_create_table.rs",
"m20220101_000001_create_table",
),
(
"src/m20220101_000001_create_table.rs",
"m20220101_000001_create_table",
),
(
"migration/src/m20220101_000001_create_table.rs",
"m20220101_000001_create_table",
),
(
"/migration/src/m20220101_000001_create_table.tmp.rs",
"m20220101_000001_create_table.tmp",
),
];
for (path, expect) in pair {
assert_eq!(get_file_stem(path), expect);
}
}
}

View File

@ -1,13 +1,8 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220118_000001_create_cake_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -2,14 +2,9 @@ use super::m20220118_000001_create_cake_table::Cake;
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
use sea_orm_migration::sea_orm::DbBackend; use sea_orm_migration::sea_orm::DbBackend;
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220118_000002_create_fruit_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -1,14 +1,9 @@
use sea_orm_migration::prelude::*; use sea_orm_migration::prelude::*;
use sea_orm_migration::sea_orm::{entity::*, query::*}; use sea_orm_migration::sea_orm::{entity::*, query::*};
#[derive(DeriveMigrationName)]
pub struct Migration; pub struct Migration;
impl MigrationName for Migration {
fn name(&self) -> &str {
"m20220118_000003_seed_cake_table"
}
}
#[async_trait::async_trait] #[async_trait::async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {

View File

@ -329,8 +329,8 @@ pub use schema::*;
#[cfg(feature = "macros")] #[cfg(feature = "macros")]
pub use sea_orm_macros::{ pub use sea_orm_macros::{
DeriveActiveEnum, DeriveActiveModel, DeriveActiveModelBehavior, DeriveColumn, DeriveActiveEnum, DeriveActiveModel, DeriveActiveModelBehavior, DeriveColumn,
DeriveCustomColumn, DeriveEntity, DeriveEntityModel, DeriveIntoActiveModel, DeriveModel, DeriveCustomColumn, DeriveEntity, DeriveEntityModel, DeriveIntoActiveModel,
DerivePrimaryKey, DeriveRelation, FromQueryResult, DeriveMigrationName, DeriveModel, DerivePrimaryKey, DeriveRelation, FromQueryResult,
}; };
pub use sea_query; pub use sea_query;