Ajouter une Nouvelle Règle de Validation et un Flag
Utilisez cette compétence quand vous devez ajouter une nouvelle règle de validation au package dart_skills_lint, l'exposer comme un flag CLI basculable, et vérifier son comportement.
🛠️ Implémentation Étape par Étape
1. Créer la Classe de Règle
Créez un nouveau fichier dans lib/src/rules/ qui étend SkillRule.
// lib/src/rules/my_new_rule.dart
import '../models/analysis_severity.dart';
import '../models/skill_context.dart';
import '../models/skill_rule.dart';
import '../models/validation_error.dart';
class MyNewRule extends SkillRule {
MyNewRule({super.severity});
@override
Future<List<ValidationError>> validate(SkillContext context) async {
final errors = <ValidationError>[];
// Ajoutez la logique de validation ici en utilisant context.rawContent ou context.directory
return errors;
}
}
2. Enregistrer la Règle dans lib/src/rule_registry.dart
Ajoutez une nouvelle instance CheckType à la liste RuleRegistry.allChecks. Cela expose automatiquement un flag CLI.
// lib/src/rule_registry.dart dans la liste allChecks
const CheckType(
name: MyNewRule.ruleName,
defaultSeverity: MyNewRule.defaultSeverity,
help: 'Description de ce que fait la règle pour l\'aide CLI.',
),
Ensuite, ajoutez un cas à RuleRegistry.createRule pour instancier votre règle :
// lib/src/rule_registry.dart dans la méthode createRule
static SkillRule? createRule(String name, AnalysisSeverity severity) {
switch (name) {
// ... autres règles
case MyNewRule.ruleName:
return MyNewRule(severity: severity);
default:
return null;
}
}
3. Gérer les Règles Désactivées par Défaut (Si applicable)
Si la règle est désactivée par défaut (defaultSeverity: AnalysisSeverity.disabled), passer le flag --check-my-new-rule l'activera automatiquement avec la sévérité AnalysisSeverity.error (géré dans entry_point.dart).
🧪 Tester la Nouvelle Règle
Vous devez écrire des tests automatisés vérifiant que votre règle se déclenche quand elle le devrait et s'ignore quand elle ne devrait pas.
Approche Préférée : Tests Unitaires en Mémoire
Au lieu d'écrire des fichiers sur le disque, testez la règle directement en utilisant un mock SkillContext. C'est plus rapide et évite les dépendances d'E/S.
// test/my_new_rule_test.dart
import 'dart:io';
import 'package:dart_skills_lint/src/models/analysis_severity.dart';
import 'package:dart_skills_lint/src/models/skill_context.dart';
import 'package:dart_skills_lint/src/models/validation_error.dart';
import 'package:dart_skills_lint/src/rules/my_new_rule.dart';
import 'package:test/test.dart';
void main() {
group('MyNewRule', () {
test('flags invalid content', () async {
final rule = MyNewRule(severity: AnalysisSeverity.warning);
final context = SkillContext(
directory: Directory('dummy'),
rawContent: 'Invalid content',
);
final List<ValidationError> errors = await rule.validate(context);
expect(errors, isNotEmpty);
expect(errors.first.message, contains('Expected error message'));
});
test('passes valid content', () async {
final rule = MyNewRule(severity: AnalysisSeverity.warning);
final context = SkillContext(
directory: Directory('dummy'),
rawContent: 'Valid content',
);
final List<ValidationError> errors = await rule.validate(context);
expect(errors, isEmpty);
});
});
}
Tests d'Intégration
Si la règle interagit avec des flags CLI ou des fichiers de configuration, ajoutez un test dans test/cli_integration_test.dart en utilisant TestProcess.
[!IMPORTANT] Lors de l'écriture de tests d'intégration qui utilisent des fichiers de configuration et
TestProcess, assurez-vous que les chemins dans le fichier de configuration et les chemins passés à la CLI correspondent en style (tous relatifs ou tous absolus) pour éviter des problèmes de correspondance de chemins dansentry_point.dart.
📚 Mises à Jour de la Documentation
Quand une nouvelle règle est introduite, vérifiez que vous synchronisez les fichiers markdown frères !
README.md:- Ajoutez votre flag sous les sections Usage et Flags pour que les utilisateurs sachent qu'il existe.
documentation/knowledge/SPECIFICATION.md:- Documentez la contrainte formelle dans la spécification si elle définit un standard pour les fichiers skill.
🚦 Liste de Vérification Avant de Soumettre la PR
- [ ] Classe de règle créée dans
lib/src/rules/. - [ ] Règle enregistrée dans
lib/src/rule_registry.dart. - [ ] Tests unitaires ajoutés dans
test/en utilisantSkillContexten mémoire. - [ ] Utilisation listée dans
README.md. - [ ] Schéma documenté dans
documentation/knowledge/SPECIFICATION.md(si applicable). - [ ] Exécutez
dart format .pour formater le code. - [ ] Exécutez
dart analyze --fatal-infospour vous assurer qu'il n'y a pas de problèmes. - [ ] Exécutez
dart testpour vous assurer que les tests réussissent.