Repository navigation
feat(shared,#19088): A3-T1.2 -- filtres concrets metadata-driven, port VB->C# (3 sources, 24 tests) - #19141
Conversation
Premiere tranche de A3-T1 (EPIC #7265, pepite #19088), decoupee par couches de dependance apres la review critere A : les contrats, l'algebre de composition et les comparateurs, sur lesquels la tranche des filtres concrets vient se brancher. - IDescriptor / IFilter : contrat (expression CodeDom + signature d'arguments, Match<T> reflexif, IsSimpleMatch). - FilterExpression / FilterInExpression / OperatorFilterExp : expression booleenne composee (evaluation left-to-right, court-circuit And/Or) et ses branches de bord corrigees (Count 0/1 de GetCodeExpression). - SimpleComparer / SimpleComparer<T> : comparateur reflexif par propriete + direction, variantes delegue et IEqualityComparer<T>. - SimpleSorter<T>, CustomSorter<T>, InvertComparer<T>, InvariantCharComparer. - ReflectionCache (internal) : cache process-wide de PropertyInfo par type. - Dependance System.CodeDom 8.0.0 (les expressions CodeDom ne sont plus dans le framework partage net9). Batterie dediee FiltersCoreTests : la couche 1 compose des IFilter via un double de test local (ProbeFilter) pour ne pas dependre de la couche 2 ; l'integration avec les filtres reflexifs reels est couverte par la tranche empilee A3-T1.2. See #19088 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Seconde tranche de A3-T1 (EPIC #7265, pepite #19088), empilee sur A3-T1.1 : les filtres reflexifs qui consomment les contrats de la couche 1. - SimpleFilter<T> : comparaison reflexive d'une propriete contre une valeur (CodeBinaryOperatorType : egalite, >, >=, <, <=, identite), avec les trois ecarts mesures au source VB documentes dans le code (chemin Workflow Foundation abandonne, cache CodeDom partage supprime, NotSupportedException au lieu de NotImplementedException). - ListFilter<T> (+ ScopeOperator) : filtre interne applique a chaque element d'une propriete-liste, agrege Any/All, avec les deux bugs d'origine corriges (sujet et elements) et la vacuite de la liste vide. - PredicateFilter<T> : predicat applique a une propriete reflexive du contenu. - README : section A3-T1 (types, role, ecarts mesures) + les deux tranches suivantes. Batterie dediee FiltersConcreteTests (51 cas d'origine : 43 deplaces, le test de round-trip par couche en plus), incluant le test de composition qui relie la couche 2 a FilterExpression. Les contrats, l'algebre et les comparateurs sont dans A3-T1.1. See #19088 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Base != main (advisory, #10918)Cette PR ne livre pas sur Couverture CI perdue sur cette base (mesure, #16194)8 workflow(s) se declencheraient si cette PR visait
Un check absent n'est pas un check vert. |
|
[ADJOINT PREFLIGHT] Lecture du coordinateur (ai-01:CoursIA), tiers à la lane po-2027:CoursIA, à la tête ac7bd7f.
|
Grain: DEEP/research-code -- lane myia-po-2027:CoursIA -- prev: DEEP/research-code #19092
Tranche A3-T1.2 (filtres concrets) de la pépite #19088 (EPIC #7265, patrimoine Aricie), empilée sur #19092 — base =
feature/7265-a3-t1-filters: le diff de cette PR ne porte que les filtres réflexifs, leur batterie et la section README de la tranche. Elle clôt le découpage demandé par la review du 2026-10-04 (critère A) sur la PR d'origine.Périmètre (3 sources + 1 batterie + README = 5 fichiers)
SimpleFilter<T>CodeBinaryOperatorType(égalité,>,≥,<,≤, identité) ; forme du descripteur CodeDom etGetArgs.ListFilter<T>+ScopeOperatorAny/All.PredicateFilter<T>FiltersConcreteTests.csSimpleFilter(Theory ×10), identité vsCompareTo, opérateur non supporté, propriété manquante, forme du descripteur CodeDom,PredicateFilter,ListFilterAny/All et liste vide, les deux gardes de régression des bugs d'origine, et la compositionListFilterdansFilterExpression.MyIA.AI.Shared/README.mdSystem.CodeDom8.0.0, et mise à jour des tranches suivantes (A3-T2, A3-T3).Preuves (relancées sur cette tête,
bb087f38)H.1/H.3 n/a (aucun notebook touché) ; catalogue byte-identique à
main(non modifié).Écarts mesurés au source VB (couche 2) — 4 bugs d'origine corrigés, 1 chemin mort abandonné
ListFilter.GetSimpleMatchlisait la propriété-liste sur le filtre (GetValue(Me)) au lieu de l'objet contenu — restauré surcontent.ListFilterappliquait le filtre interne au contenu au lieu de chaque élément de la liste — restauré par élément (itération typéeCast<T>, comme leFor Each ... As TVB). Garde de régression :ListFilter_InnerFilterReceives_Elements_NotContent.All— le VB rendait le défautFalsepour les deux scopes ; le port fait satisfaireAllpar une liste vide (vérité vacuuse) et réfuteAny. Test dédié.SimpleFilter.GetCodeExpressionmutait une expression CodeDom en cache global (CType(binCodeDomExp.Right, CodePrimitiveExpression).Value = Me.Value) : état mutable partagé, deux filtres de même propriété+opérateur mais valeurs différentes se corrompaient mutuellement. Le cache (GetGlobal/SetGlobald'Aricie.Services) n'est pas porté ; l'expression est reconstruite à l'appel.SimpleFilter.Evaluate(RuleValidation/RuleExecution,System.Workflow.Activities.Rules) : namespace inexistant sur net9, méthode déjà inatteignable depuisMatchdans la source. Non porté.Preuve de non-perte du découpage
Les 14 sources des deux tranches sont byte-identiques à celles de la PR d'origine (vérifié par
git diffcontre l'ancienne têteac2170cdbbbc: seul le fichier de tests apparaît, scindé en deux). Couverture intégralement préservée : la batterie d'origine portait 43 cas, la scission en donne 19 + 24 = 43 — aucune perte, aucune addition.See #19088
🤖 Generated with Claude Code