# Story 10.5: Migration et Dépréciation des Anciens Types **Epic:** 10 - Enhanced Boundary Conditions **Priorité:** P1-HIGH **Estimation:** 2h **Statut:** backlog **Dépendances:** Stories 10-2, 10-3, 10-4 --- ## Story > En tant que développeur de la librairie Entropyk, > Je veux déprécier les anciens types `FlowSource` et `FlowSink` avec un guide de migration, > Afin de garantir une transition en douceur pour les utilisateurs existants. --- ## Contexte Les types `FlowSource` et `FlowSink` existants doivent être progressivement remplacés par les nouveaux types typés: | Ancien Type | Nouveau Type | |-------------|--------------| | `FlowSource::incompressible("Water", ...)` | `BrineSource::water(...)` | | `FlowSource::incompressible("MEG", ...)` | `BrineSource::glycol_mixture("MEG", ...)` | | `FlowSource::compressible("R410A", ...)` | `RefrigerantSource::new("R410A", ...)` | | `FlowSink::incompressible(...)` | `BrineSink::water(...)` ou `BrineSink::glycol_mixture(...)` | | `FlowSink::compressible(...)` | `RefrigerantSink::new(...)` | --- ## Spécifications Techniques ### 1. Ajouter Attributs de Dépréciation ```rust // crates/components/src/flow_boundary.rs #[deprecated( since = "0.2.0", note = "Use RefrigerantSource or BrineSource instead. \ See migration guide in docs/migration/boundary-conditions.md" )] pub struct FlowSource { /* ... */ } #[deprecated( since = "0.2.0", note = "Use RefrigerantSink or BrineSink instead. \ See migration guide in docs/migration/boundary-conditions.md" )] pub struct FlowSink { /* ... */ } ``` ### 2. Mapper les Anciens Constructeurs ```rust impl FlowSource { #[deprecated( since = "0.2.0", note = "Use BrineSource::water() for water or BrineSource::glycol_mixture() for glycol" )] pub fn incompressible( fluid: impl Into, p_set_pa: f64, h_set_jkg: f64, outlet: ConnectedPort, ) -> Result { // Log de warning log::warn!( "FlowSource::incompressible is deprecated. \ Use BrineSource::water() or BrineSource::glycol_mixture() instead." ); // Créer le type approprié en interne let fluid = fluid.into(); if fluid == "Water" { // Déléguer vers BrineSource::water() } else { // Déléguer vers BrineSource::glycol_mixture() } } #[deprecated( since = "0.2.0", note = "Use RefrigerantSource::new() instead" )] pub fn compressible( fluid: impl Into, p_set_pa: f64, h_set_jkg: f64, outlet: ConnectedPort, ) -> Result { log::warn!( "FlowSource::compressible is deprecated. \ Use RefrigerantSource::new() instead." ); // ... } } ``` ### 3. Créer le Guide de Migration ```markdown # docs/migration/boundary-conditions.md # Migration Guide: Boundary Conditions ## Overview The `FlowSource` and `FlowSink` types have been replaced with typed alternatives: - `RefrigerantSource` / `RefrigerantSink` - for refrigerants - `BrineSource` / `BrineSink` - for liquid heat transfer fluids - `AirSource` / `AirSink` - for humid air ## Migration Examples ### Water Source (Before) \`\`\`rust let source = FlowSource::incompressible("Water", 3.0e5, 63_000.0, port)?; \`\`\` ### Water Source (After) \`\`\`rust let source = BrineSource::water( Temperature::from_celsius(15.0), Pressure::from_pascals(3.0e5), port )?; \`\`\` ### Refrigerant Source (Before) \`\`\`rust let source = FlowSource::compressible("R410A", 10.0e5, 280_000.0, port)?; \`\`\` ### Refrigerant Source (After) \`\`\`rust let source = RefrigerantSource::new( "R410A", Pressure::from_pascals(10.0e5), Enthalpy::from_joules_per_kg(280_000.0), port )?; \`\`\` ## Benefits of New Types 1. **Type Safety**: Fluid type is explicit in the type name 2. **Concentration Support**: BrineSource supports glycol concentration 3. **Vapor Quality**: RefrigerantSource supports vapor quality input 4. **Psychrometrics**: AirSource supports humidity and wet bulb temperature \`\`\` ``` --- ## Fichiers à Modifier | Fichier | Action | |---------|--------| | `crates/components/src/flow_boundary.rs` | Ajouter attributs `#[deprecated]` | | `docs/migration/boundary-conditions.md` | Créer guide de migration | | `CHANGELOG.md` | Documenter les changements breaking | --- ## Critères d'Acceptation - [ ] `FlowSource` marqué `#[deprecated]` avec message explicite - [ ] `FlowSink` marqué `#[deprecated]` avec message explicite - [ ] Type aliases `IncompressibleSource`, etc. également dépréciés - [ ] Guide de migration créé avec exemples - [ ] CHANGELOG mis à jour - [ ] Tests existants passent toujours (rétrocompatibilité) --- ## Tests Requis ```rust #[cfg(test)] mod tests { #[test] fn test_deprecated_flow_source_still_works() { // Vérifier que les anciens types fonctionnent encore // (avec warning de dépréciation) } #[test] fn test_migration_water_source() { // Vérifier que le nouveau type donne les mêmes résultats } #[test] fn test_migration_refrigerant_source() { // Vérifier que le nouveau type donne les mêmes résultats } } ``` --- ## Timeline de Suppression | Version | Action | |---------|--------| | 0.2.0 | Dépréciation avec warnings | | 0.3.0 | Les anciens types sont cachés par défaut (feature flag) | | 1.0.0 | Suppression complète des anciens types | --- ## Références - [Architecture Document](../../plans/boundary-condition-refactoring-architecture.md) - [Epic 10](../planning-artifacts/epic-10-enhanced-boundary-conditions.md)