Skip to content

fix: erreur explicite quand une colonne cle est absente d'un dataset - #35

Merged
VincentGuyader merged 2 commits into
audit-0.4.10from
fix/issue-16-key-not-found-return
Jul 2, 2026
Merged

VincentGuyader merged 2 commits into
audit-0.4.10from
fix/issue-16-key-not-found-return

Conversation

@VincentGuyader

Copy link
Copy Markdown
Member

Closes #16

Probleme

Quand la cle etait absente d'un des deux datasets, compare_datasets_from_yaml() emettait un message() vague puis retournait une liste tronquee a 6 champs (sans coverage ni summary), cassant les consommateurs aval (datadiff_report_html(), res$summary$n_fail NULL silencieux, pointblank::all_passed(res$reponse) en erreur).

Correctif

  • stop() explicite nommant la ou les colonnes cles manquantes et le ou les datasets concernes (Key column(s) not found: 'id' missing in data_candidate.)
  • setdiff() par dataset remplace la condition scalaire | (point l.406 de l'issue)
  • @param key documente le comportement, man/ regenere
  • Entree NEWS sous « Breaking changes », version dev 0.4.9.9000

Tests (TDD red-first)

Le test qui verrouillait l'ancien retour mou est remplace par des expect_error/expect_match couvrant : cle absente des deux cotes, cote candidat seul, sans YAML explicite (template auto), cle multi-colonnes partiellement absente. Rouge constate sur l'ancien code (retour liste au lieu d'erreur), vert apres fix.

Suite complete : 809 PASS / 0 FAIL (baseline 802 PASS).

Review interne

pr-reviewer : APPROVE, matrice de couverture complete, test de regression verifie discriminant contre la 0.4.9 installee. Nit corrige (fixed = FALSE redondant). Les YAML ecrits en cwd par les tests voisins relevent de #31.

…(issue #16)

Le retour anticipe silencieux (liste tronquee a 6 champs sans coverage ni
summary) est remplace par un stop() qui nomme les colonnes cles manquantes
et le ou les datasets concernes. Le test qui verrouillait l'ancien
comportement est remplace par des expect_error/expect_match couvrant :
cle absente des deux cotes, cote candidat seul, sans YAML explicite,
et cle multi-colonnes partiellement absente.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Ce PR corrige un comportement incorrect de compare_datasets_from_yaml() lorsque la/les colonne(s) clé(s) sont absentes d’un dataset, en remplaçant un retour “dégradé” (liste tronquée) par une erreur explicite, afin d’éviter de casser les consommateurs aval.

Changes:

  • Remplacement du message() + retour anticipé incomplet par un stop() explicite listant les colonnes clés manquantes et le(s) dataset(s) concerné(s).
  • Ajout/ajustement de tests testthat couvrant les cas “clé absente” (dont clé multi-colonnes partiellement absente) et nettoyage via tempfile() + on.exit(unlink(...)).
  • Mise à jour de la documentation (roxygen + Rd), du NEWS et bump de version en 0.4.9.9000.

Reviewed changes

Copilot reviewed 4 out of 5 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tests/testthat/test-key-parameter.R Remplace l’ancien test “retour mou” par des assertions sur l’erreur explicite + utilise un YAML temporaire.
R/compare_datasets_from_yaml.R Implémente la détection des clés manquantes via setdiff() par dataset et lève une erreur explicite.
NEWS.md Documente le changement de comportement comme breaking change (référence issue #16).
man/compare_datasets_from_yaml.Rd Synchronise la doc utilisateur avec le nouveau comportement de key.
DESCRIPTION Passe la version en développement (0.4.9.9000).
Files not reviewed (1)
  • man/compare_datasets_from_yaml.Rd: Generated file

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread R/compare_datasets_from_yaml.R Outdated
Comment on lines +407 to +409
if (!is.null(key)) {
if (isFALSE(all(key %in% get_col_names(data_reference_p))) | isFALSE(all(key %in% get_col_names(data_candidate_p)))) {
message("could not find key in both data")
return(
list(
all_passed = FALSE,
agent = NULL,
reponse = NULL,
missing_in_candidate = NULL,
extra_in_candidate = NULL,
applied_rules = NULL
missing_key_ref <- setdiff(key, get_col_names(data_reference_p))
missing_key_cand <- setdiff(key, get_col_names(data_candidate_p))
Comment thread R/compare_datasets_from_yaml.R Outdated
Comment on lines +425 to +428
stop(sprintf(
"Key column(s) not found: %s.",
paste(details, collapse = "; ")
), call. = FALSE)
Reponse a la review Copilot de la PR :
- la cle passee en argument est validee contre les DEUX datasets avant la
  branche path = NULL, qui atteignait write_rules_template() en premier et
  levait une erreur ne validant que la reference, dans un format different
- une cle vide (character(0)) ou non-character est rejetee proprement au
  lieu de tomber dans un cross join dplyr deprecie
- la validation est factorisee dans validate_comparison_key(), reutilisee
  par le check tardif qui couvre les cles issues du YAML

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 5 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • man/compare_datasets_from_yaml.Rd: Generated file

Comment on lines +463 to +467
# Re-validated here because the key may come from the YAML rules
# (defaults$keys), which the argument-level check upstream cannot see.
validate_comparison_key(
key,
ref_cols = get_col_names(data_reference_p),

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bien vu sur le fond : c'est l'issue #20 (resolution YAML vs arguments fragile), corrigee dans la PR suivante de la pile via rules$defaults[["keys"]] %||% rules$defaults[["key"]].

Nuance factuelle : sur cette PR telle quelle, la cle YAML est bien recuperee et validee. list(keys = "id")$key renvoie "id" par partial matching de $ (key est un prefixe strict de keys). Le defaut n'est donc pas "never picked up" mais la fragilite de ce match accidentel : il tombe a NULL des qu'un second champ prefixe key* apparait dans le YAML. Le passage a [[ supprime cette dependance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants