From e7f2aed1ef0f0f422b2237ab106987208dae97fd Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 25 Jan 2024 20:26:46 -0500 Subject: [PATCH] new inference category for fbx -> gltf --- .../frontend_failure_category.rs | 2 +- .../inference_category.rs | 128 +++++++++------ .../inference_input_source_token_type.rs | 2 +- .../inference_model_type.rs | 151 ++++++++++-------- .../inference_result_type.rs | 2 +- 5 files changed, 171 insertions(+), 114 deletions(-) diff --git a/crates/_types/enums/src/by_table/generic_inference_jobs/frontend_failure_category.rs b/crates/_types/enums/src/by_table/generic_inference_jobs/frontend_failure_category.rs index ceee312b0a..f7d7b6652a 100644 --- a/crates/_types/enums/src/by_table/generic_inference_jobs/frontend_failure_category.rs +++ b/crates/_types/enums/src/by_table/generic_inference_jobs/frontend_failure_category.rs @@ -18,7 +18,7 @@ use strum::EnumIter; /// Another benefit is that we'll surface all of the various types of failure and perhaps eventually /// come to handle some in a cross-cutting way. /// -/// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY. +/// YOU CAN ADD NEW VALUES, BUT DO NOT CHANGE EXISTING VALUES WITHOUT A MIGRATION STRATEGY. #[cfg_attr(test, derive(EnumIter, EnumCount))] #[derive(Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd, Deserialize, Serialize)] pub enum FrontendFailureCategory { diff --git a/crates/_types/enums/src/by_table/generic_inference_jobs/inference_category.rs b/crates/_types/enums/src/by_table/generic_inference_jobs/inference_category.rs index 93bfaa40b1..26652eca36 100644 --- a/crates/_types/enums/src/by_table/generic_inference_jobs/inference_category.rs +++ b/crates/_types/enums/src/by_table/generic_inference_jobs/inference_category.rs @@ -11,7 +11,7 @@ use strum::EnumIter; /// Each "category" of inference is identified by the following enum variants. /// These types are present in the HTTP API and database columns as serialized here. /// -/// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY. +/// YOU CAN ADD NEW VALUES, BUT DO NOT CHANGE EXISTING VALUES WITHOUT A MIGRATION STRATEGY. #[cfg_attr(test, derive(EnumIter, EnumCount))] #[derive(Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd, Deserialize, Serialize, Default)] pub enum InferenceCategory { @@ -37,6 +37,10 @@ pub enum InferenceCategory { #[serde(rename = "workflow")] Workflow, + + /// Eg. A job that turns "FBX" animation files into "GLTF" animation files. + #[serde(rename = "format_conversion")] + FormatConversion, } // TODO(bt, 2022-12-21): This desperately needs MySQL integration tests! @@ -54,6 +58,7 @@ impl InferenceCategory { Self::ImageGeneration => "image_generation", Self::Mocap => "mocap", Self::Workflow => "workflow", + Self::FormatConversion => "format_conversion", } } @@ -66,6 +71,7 @@ impl InferenceCategory { "image_generation" => Ok(Self::ImageGeneration), "mocap" => Ok(Self::Mocap), "workflow" => Ok(Self::Workflow), + "format_conversion" => Ok(Self::FormatConversion), _ => Err(format!("invalid value: {:?}", value)), } } @@ -81,6 +87,7 @@ impl InferenceCategory { Self::ImageGeneration, Self::Mocap, Self::Workflow, + Self::FormatConversion, ]) } } @@ -90,55 +97,82 @@ mod tests { use crate::by_table::generic_inference_jobs::inference_category::InferenceCategory; use crate::test_helpers::assert_serialization; - #[test] - fn test_serialization() { - assert_serialization(InferenceCategory::LipsyncAnimation, "lipsync_animation"); - assert_serialization(InferenceCategory::TextToSpeech, "text_to_speech"); - assert_serialization(InferenceCategory::VoiceConversion, "voice_conversion"); - assert_serialization(InferenceCategory::VideoFilter, "video_filter"); - assert_serialization(InferenceCategory::ImageGeneration, "image_generation"); - assert_serialization(InferenceCategory::Mocap, "mocap"); - assert_serialization(InferenceCategory::Workflow, "workflow") + mod explicit_checks { + use super::*; + + #[test] + fn test_serialization() { + assert_serialization(InferenceCategory::LipsyncAnimation, "lipsync_animation"); + assert_serialization(InferenceCategory::TextToSpeech, "text_to_speech"); + assert_serialization(InferenceCategory::VoiceConversion, "voice_conversion"); + assert_serialization(InferenceCategory::VideoFilter, "video_filter"); + assert_serialization(InferenceCategory::ImageGeneration, "image_generation"); + assert_serialization(InferenceCategory::Mocap, "mocap"); + assert_serialization(InferenceCategory::Workflow, "workflow"); + assert_serialization(InferenceCategory::FormatConversion, "format_conversion"); + } + + #[test] + fn to_str() { + assert_eq!(InferenceCategory::LipsyncAnimation.to_str(), "lipsync_animation"); + assert_eq!(InferenceCategory::TextToSpeech.to_str(), "text_to_speech"); + assert_eq!(InferenceCategory::VoiceConversion.to_str(), "voice_conversion"); + assert_eq!(InferenceCategory::VideoFilter.to_str(), "video_filter"); + assert_eq!(InferenceCategory::ImageGeneration.to_str(), "image_generation"); + assert_eq!(InferenceCategory::Mocap.to_str(), "mocap"); + assert_eq!(InferenceCategory::Workflow.to_str(), "workflow"); + assert_eq!(InferenceCategory::FormatConversion.to_str(), "format_conversion"); + } + + #[test] + fn from_str() { + assert_eq!(InferenceCategory::from_str("lipsync_animation").unwrap(), InferenceCategory::LipsyncAnimation); + assert_eq!(InferenceCategory::from_str("text_to_speech").unwrap(), InferenceCategory::TextToSpeech); + assert_eq!(InferenceCategory::from_str("voice_conversion").unwrap(), InferenceCategory::VoiceConversion); + assert_eq!(InferenceCategory::from_str("video_filter").unwrap(), InferenceCategory::VideoFilter); + assert_eq!(InferenceCategory::from_str("image_generation").unwrap(), InferenceCategory::ImageGeneration); + assert_eq!(InferenceCategory::from_str("mocap").unwrap(), InferenceCategory::Mocap); + assert_eq!(InferenceCategory::from_str("workflow").unwrap(), InferenceCategory::Workflow); + assert_eq!(InferenceCategory::from_str("format_conversion").unwrap(), InferenceCategory::FormatConversion); + } + + #[test] + fn all_variants() { + // Static check + let mut variants = InferenceCategory::all_variants(); + assert_eq!(variants.len(), 8); + assert_eq!(variants.pop_first(), Some(InferenceCategory::LipsyncAnimation)); + assert_eq!(variants.pop_first(), Some(InferenceCategory::TextToSpeech)); + assert_eq!(variants.pop_first(), Some(InferenceCategory::VoiceConversion)); + assert_eq!(variants.pop_first(), Some(InferenceCategory::VideoFilter)); + assert_eq!(variants.pop_first(), Some(InferenceCategory::ImageGeneration)); + assert_eq!(variants.pop_first(), Some(InferenceCategory::Mocap)); + assert_eq!(variants.pop_first(), Some(InferenceCategory::Workflow)); + assert_eq!(variants.pop_first(), Some(InferenceCategory::FormatConversion)); + assert_eq!(variants.pop_first(), None); + + // Generated check + use strum::IntoEnumIterator; + assert_eq!(InferenceCategory::all_variants().len(), InferenceCategory::iter().len()); + } } - #[test] - fn to_str() { - assert_eq!(InferenceCategory::LipsyncAnimation.to_str(), "lipsync_animation"); - assert_eq!(InferenceCategory::TextToSpeech.to_str(), "text_to_speech"); - assert_eq!(InferenceCategory::VoiceConversion.to_str(), "voice_conversion"); - assert_eq!(InferenceCategory::VideoFilter.to_str(), "video_filter"); - assert_eq!(InferenceCategory::ImageGeneration.to_str(), "image_generation"); - assert_eq!(InferenceCategory::Mocap.to_str(), "mocap"); - assert_eq!(InferenceCategory::Workflow.to_str(), "workflow"); - } + mod mechanical_checks { + use super::*; - #[test] - fn from_str() { - assert_eq!(InferenceCategory::from_str("lipsync_animation").unwrap(), InferenceCategory::LipsyncAnimation); - assert_eq!(InferenceCategory::from_str("text_to_speech").unwrap(), InferenceCategory::TextToSpeech); - assert_eq!(InferenceCategory::from_str("voice_conversion").unwrap(), InferenceCategory::VoiceConversion); - assert_eq!(InferenceCategory::from_str("video_filter").unwrap(), InferenceCategory::VideoFilter); - assert_eq!(InferenceCategory::from_str("image_generation").unwrap(), InferenceCategory::ImageGeneration); - assert_eq!(InferenceCategory::from_str("mocap").unwrap(), InferenceCategory::Mocap); - assert_eq!(InferenceCategory::from_str("workflow").unwrap(), InferenceCategory::Workflow); - } + #[test] + fn variant_length() { + use strum::IntoEnumIterator; + assert_eq!(InferenceCategory::all_variants().len(), InferenceCategory::iter().len()); + } - #[test] - fn all_variants() { - // Static check - let mut variants = InferenceCategory::all_variants(); - assert_eq!(variants.len(), 7); - assert_eq!(variants.pop_first(), Some(InferenceCategory::LipsyncAnimation)); - assert_eq!(variants.pop_first(), Some(InferenceCategory::TextToSpeech)); - assert_eq!(variants.pop_first(), Some(InferenceCategory::VoiceConversion)); - assert_eq!(variants.pop_first(), Some(InferenceCategory::VideoFilter)); - assert_eq!(variants.pop_first(), Some(InferenceCategory::ImageGeneration)); - assert_eq!(variants.pop_first(), Some(InferenceCategory::Mocap)); - assert_eq!(variants.pop_first(), Some(InferenceCategory::Workflow)); - assert_eq!(variants.pop_first(), None); - - // Generated check - use strum::IntoEnumIterator; - assert_eq!(InferenceCategory::all_variants().len(), InferenceCategory::iter().len()); + #[test] + fn round_trip() { + for variant in InferenceCategory::all_variants() { + assert_eq!(variant, InferenceCategory::from_str(variant.to_str()).unwrap()); + assert_eq!(variant, InferenceCategory::from_str(&format!("{}", variant)).unwrap()); + assert_eq!(variant, InferenceCategory::from_str(&format!("{:?}", variant)).unwrap()); + } + } } } diff --git a/crates/_types/enums/src/by_table/generic_inference_jobs/inference_input_source_token_type.rs b/crates/_types/enums/src/by_table/generic_inference_jobs/inference_input_source_token_type.rs index a8332f5679..bbddcce2f7 100644 --- a/crates/_types/enums/src/by_table/generic_inference_jobs/inference_input_source_token_type.rs +++ b/crates/_types/enums/src/by_table/generic_inference_jobs/inference_input_source_token_type.rs @@ -7,7 +7,7 @@ use strum::EnumIter; /// Used in the `generic_inference_jobs` table in `VARCHAR(32)` field `maybe_input_source_token`. /// -/// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY. +/// YOU CAN ADD NEW VALUES, BUT DO NOT CHANGE EXISTING VALUES WITHOUT A MIGRATION STRATEGY. #[cfg_attr(test, derive(EnumIter, EnumCount))] #[derive(Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd, Deserialize, Serialize)] pub enum InferenceInputSourceTokenType { diff --git a/crates/_types/enums/src/by_table/generic_inference_jobs/inference_model_type.rs b/crates/_types/enums/src/by_table/generic_inference_jobs/inference_model_type.rs index a1d7dcfebf..ae25f6274d 100644 --- a/crates/_types/enums/src/by_table/generic_inference_jobs/inference_model_type.rs +++ b/crates/_types/enums/src/by_table/generic_inference_jobs/inference_model_type.rs @@ -13,7 +13,7 @@ use strum::EnumIter; /// /// These types are present in the HTTP API and database columns as serialized here. /// -/// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY. +/// YOU CAN ADD NEW VALUES, BUT DO NOT CHANGE EXISTING VALUES WITHOUT A MIGRATION STRATEGY. #[cfg_attr(test, derive(EnumIter, EnumCount))] #[derive(Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd, Deserialize, Serialize)] pub enum InferenceModelType { @@ -106,71 +106,94 @@ mod tests { use crate::by_table::generic_inference_jobs::inference_model_type::InferenceModelType; use crate::test_helpers::assert_serialization; - #[test] - fn test_serialization() { - assert_serialization(InferenceModelType::RvcV2, "rvc_v2"); - assert_serialization(InferenceModelType::SadTalker, "sad_talker"); - assert_serialization(InferenceModelType::SoVitsSvc, "so_vits_svc"); - assert_serialization(InferenceModelType::Tacotron2, "tacotron2"); - assert_serialization(InferenceModelType::Vits, "vits"); - assert_serialization(InferenceModelType::VallEX, "vall_e_x"); - assert_serialization(InferenceModelType::RerenderAVideo, "rerender_a_video"); - assert_serialization(InferenceModelType::StableDiffusion, "stable_diffusion"); - assert_serialization(InferenceModelType::MocapNet, "mocap_net"); - assert_serialization(InferenceModelType::ComfyUi, "comfy_ui"); - assert_serialization(InferenceModelType::StyleTTS2, "styletts2"); + mod explicit_checks { + use super::*; + + #[test] + fn test_serialization() { + assert_serialization(InferenceModelType::RvcV2, "rvc_v2"); + assert_serialization(InferenceModelType::SadTalker, "sad_talker"); + assert_serialization(InferenceModelType::SoVitsSvc, "so_vits_svc"); + assert_serialization(InferenceModelType::Tacotron2, "tacotron2"); + assert_serialization(InferenceModelType::Vits, "vits"); + assert_serialization(InferenceModelType::VallEX, "vall_e_x"); + assert_serialization(InferenceModelType::RerenderAVideo, "rerender_a_video"); + assert_serialization(InferenceModelType::StableDiffusion, "stable_diffusion"); + assert_serialization(InferenceModelType::MocapNet, "mocap_net"); + assert_serialization(InferenceModelType::ComfyUi, "comfy_ui"); + assert_serialization(InferenceModelType::StyleTTS2, "styletts2"); + } + + #[test] + fn to_str() { + assert_eq!(InferenceModelType::RvcV2.to_str(), "rvc_v2"); + assert_eq!(InferenceModelType::SadTalker.to_str(), "sad_talker"); + assert_eq!(InferenceModelType::SoVitsSvc.to_str(), "so_vits_svc"); + assert_eq!(InferenceModelType::Tacotron2.to_str(), "tacotron2"); + assert_eq!(InferenceModelType::Vits.to_str(), "vits"); + assert_eq!(InferenceModelType::VallEX.to_str(), "vall_e_x"); + assert_eq!(InferenceModelType::RerenderAVideo.to_str(), "rerender_a_video"); + assert_eq!(InferenceModelType::StableDiffusion.to_str(), "stable_diffusion"); + assert_eq!(InferenceModelType::MocapNet.to_str(), "mocap_net"); + assert_eq!(InferenceModelType::StyleTTS2.to_str(), "styletts2"); + assert_eq!(InferenceModelType::ComfyUi.to_str(), "comfy_ui"); + } + + #[test] + fn from_str() { + assert_eq!(InferenceModelType::from_str("rvc_v2").unwrap(), InferenceModelType::RvcV2); + assert_eq!(InferenceModelType::from_str("sad_talker").unwrap(), InferenceModelType::SadTalker); + assert_eq!(InferenceModelType::from_str("so_vits_svc").unwrap(), InferenceModelType::SoVitsSvc); + assert_eq!(InferenceModelType::from_str("tacotron2").unwrap(), InferenceModelType::Tacotron2); + assert_eq!(InferenceModelType::from_str("vits").unwrap(), InferenceModelType::Vits); + assert_eq!(InferenceModelType::from_str("vall_e_x").unwrap(), InferenceModelType::VallEX); + assert_eq!(InferenceModelType::from_str("rerender_a_video").unwrap(), InferenceModelType::RerenderAVideo); + assert_eq!(InferenceModelType::from_str("stable_diffusion").unwrap(), InferenceModelType::StableDiffusion); + assert_eq!(InferenceModelType::from_str("mocap_net").unwrap(), InferenceModelType::MocapNet); + assert_eq!(InferenceModelType::from_str("styletts2").unwrap(), InferenceModelType::StyleTTS2); + assert_eq!(InferenceModelType::from_str("comfy_ui").unwrap(), InferenceModelType::ComfyUi); + } + + #[test] + fn all_variants() { + // Static check + let mut variants = InferenceModelType::all_variants(); + assert_eq!(variants.len(), 11); + assert_eq!(variants.pop_first(), Some(InferenceModelType::RvcV2)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::SadTalker)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::SoVitsSvc)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::Tacotron2)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::Vits)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::VallEX)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::RerenderAVideo)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::StableDiffusion)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::MocapNet)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::ComfyUi)); + assert_eq!(variants.pop_first(), Some(InferenceModelType::StyleTTS2)); + assert_eq!(variants.pop_first(), None); + + // Generated check + use strum::IntoEnumIterator; + assert_eq!(InferenceModelType::all_variants().len(), InferenceModelType::iter().len()); + } } + + mod mechanical_checks { + use super::*; - #[test] - fn to_str() { - assert_eq!(InferenceModelType::RvcV2.to_str(), "rvc_v2"); - assert_eq!(InferenceModelType::SadTalker.to_str(), "sad_talker"); - assert_eq!(InferenceModelType::SoVitsSvc.to_str(), "so_vits_svc"); - assert_eq!(InferenceModelType::Tacotron2.to_str(), "tacotron2"); - assert_eq!(InferenceModelType::Vits.to_str(), "vits"); - assert_eq!(InferenceModelType::VallEX.to_str(), "vall_e_x"); - assert_eq!(InferenceModelType::RerenderAVideo.to_str(), "rerender_a_video"); - assert_eq!(InferenceModelType::StableDiffusion.to_str(), "stable_diffusion"); - assert_eq!(InferenceModelType::MocapNet.to_str(), "mocap_net"); - assert_eq!(InferenceModelType::StyleTTS2.to_str(), "styletts2"); - assert_eq!(InferenceModelType::ComfyUi.to_str(), "comfy_ui"); - } + #[test] + fn variant_length() { + use strum::IntoEnumIterator; + assert_eq!(InferenceModelType::all_variants().len(), InferenceModelType::iter().len()); + } - #[test] - fn from_str() { - assert_eq!(InferenceModelType::from_str("rvc_v2").unwrap(), InferenceModelType::RvcV2); - assert_eq!(InferenceModelType::from_str("sad_talker").unwrap(), InferenceModelType::SadTalker); - assert_eq!(InferenceModelType::from_str("so_vits_svc").unwrap(), InferenceModelType::SoVitsSvc); - assert_eq!(InferenceModelType::from_str("tacotron2").unwrap(), InferenceModelType::Tacotron2); - assert_eq!(InferenceModelType::from_str("vits").unwrap(), InferenceModelType::Vits); - assert_eq!(InferenceModelType::from_str("vall_e_x").unwrap(), InferenceModelType::VallEX); - assert_eq!(InferenceModelType::from_str("rerender_a_video").unwrap(), InferenceModelType::RerenderAVideo); - assert_eq!(InferenceModelType::from_str("stable_diffusion").unwrap(), InferenceModelType::StableDiffusion); - assert_eq!(InferenceModelType::from_str("mocap_net").unwrap(), InferenceModelType::MocapNet); - assert_eq!(InferenceModelType::from_str("styletts2").unwrap(), InferenceModelType::StyleTTS2); - assert_eq!(InferenceModelType::from_str("comfy_ui").unwrap(), InferenceModelType::ComfyUi); - } - - #[test] - fn all_variants() { - // Static check - let mut variants = InferenceModelType::all_variants(); - assert_eq!(variants.len(), 11); - assert_eq!(variants.pop_first(), Some(InferenceModelType::RvcV2)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::SadTalker)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::SoVitsSvc)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::Tacotron2)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::Vits)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::VallEX)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::RerenderAVideo)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::StableDiffusion)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::MocapNet)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::ComfyUi)); - assert_eq!(variants.pop_first(), Some(InferenceModelType::StyleTTS2)); - assert_eq!(variants.pop_first(), None); - - // Generated check - use strum::IntoEnumIterator; - assert_eq!(InferenceModelType::all_variants().len(), InferenceModelType::iter().len()); + #[test] + fn round_trip() { + for variant in InferenceModelType::all_variants() { + assert_eq!(variant, InferenceModelType::from_str(variant.to_str()).unwrap()); + assert_eq!(variant, InferenceModelType::from_str(&format!("{}", variant)).unwrap()); + assert_eq!(variant, InferenceModelType::from_str(&format!("{:?}", variant)).unwrap()); + } + } } } diff --git a/crates/_types/enums/src/by_table/generic_inference_jobs/inference_result_type.rs b/crates/_types/enums/src/by_table/generic_inference_jobs/inference_result_type.rs index e411079f40..d81da5b2e8 100644 --- a/crates/_types/enums/src/by_table/generic_inference_jobs/inference_result_type.rs +++ b/crates/_types/enums/src/by_table/generic_inference_jobs/inference_result_type.rs @@ -12,7 +12,7 @@ use strum::EnumIter; /// /// These types are present in the HTTP API and database columns as serialized here. /// -/// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY. +/// YOU CAN ADD NEW VALUES, BUT DO NOT CHANGE EXISTING VALUES WITHOUT A MIGRATION STRATEGY. #[cfg_attr(test, derive(EnumIter, EnumCount))] #[derive(Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd, Deserialize, Serialize)] pub enum InferenceResultType {