From 291f0de901d053048894f7aebd583b9250ae0c79 Mon Sep 17 00:00:00 2001 From: SkyeAv Date: Mon, 24 Aug 2026 10:02:59 -0700 Subject: [PATCH] test: real-world config corpus and production-pattern runtime tests Vendor 14 sanitized production configs from MultiomicsNext (.tablassert mokg-v12/refconfigs), DAKP (tables/), and TableConfigs (FLAKASSIST/MBKG/ MOKG) under tests/fixtures/realworld, plus two legacy negative fixtures (QI-era keys, pre-rig graph layout). tests/test_realworld_configs.py validates the vendored corpus with the same recipe as test_docs_examples.py, asserts the negative fixtures are rejected with the expected legacy-key errors, pins production-observed semantics (DAKP override/split_by/nullable qualifier, unpaired effect_size drop, YAML anchor provenance, multi-section expansion, full RIG), and adds an env-gated sweep (TABLASSERT_CONFIG_CORPUS) that validates ~480 live production configs in place. One known-legacy failure (TableConfigs MOKG MIN1.yaml duplicate qualifier) is pinned strict-both-ways. tests/test_production_patterns.py adds pipeline/e2e coverage, shaped after named production configs, for features that previously had only model/op-level tests: enum-ranged qualifier literals bypassing resolution, explode-before-prefix op order, provenance.override URL rehoming in emitted KGX, reindex across all six comparisons plus default-ne, regex capture-group backrefs and qualifier-level regex, avoid/prioritize deciding ambiguous resolution, fill forward/zero, copysign transformation, suffix, nullable+prioritize+avoid qualifier combo, partial-node template merge, and row_slice at e2e level. --- tests/fixtures/realworld/README.md | 29 + .../fixtures/realworld/negative/DRUGIBD.yaml | 36 + tests/fixtures/realworld/negative/MOKG.yaml | 467 +++++++++++++ .../positive/dakp/approved_treats.yaml | 361 ++++++++++ .../positive/dakp/contraindications.yaml | 528 +++++++++++++++ .../positive/dakp/faers_applied_to_treat.yaml | 364 ++++++++++ .../realworld/positive/dakp/graph.yaml | 170 +++++ .../positive/mokg-v12/AYOGLU1.v12.yaml | 56 ++ .../positive/mokg-v12/CORREIA3.v12.yaml | 302 +++++++++ .../positive/mokg-v12/HOYER1.v12.yaml | 61 ++ .../positive/refconfigs/AYOGLU1.yaml | 54 ++ .../positive/tableconfigs/AAMER1.yaml | 65 ++ .../positive/tableconfigs/ALAM1.yaml | 68 ++ .../positive/tableconfigs/BRUNDAGE5.yaml | 71 ++ .../positive/tableconfigs/SILVARODRGUEZ3.yaml | 33 + tests/test_production_patterns.py | 633 ++++++++++++++++++ tests/test_realworld_configs.py | 252 +++++++ 17 files changed, 3550 insertions(+) create mode 100644 tests/fixtures/realworld/README.md create mode 100644 tests/fixtures/realworld/negative/DRUGIBD.yaml create mode 100644 tests/fixtures/realworld/negative/MOKG.yaml create mode 100644 tests/fixtures/realworld/positive/dakp/approved_treats.yaml create mode 100644 tests/fixtures/realworld/positive/dakp/contraindications.yaml create mode 100644 tests/fixtures/realworld/positive/dakp/faers_applied_to_treat.yaml create mode 100644 tests/fixtures/realworld/positive/dakp/graph.yaml create mode 100644 tests/fixtures/realworld/positive/mokg-v12/AYOGLU1.v12.yaml create mode 100644 tests/fixtures/realworld/positive/mokg-v12/CORREIA3.v12.yaml create mode 100644 tests/fixtures/realworld/positive/mokg-v12/HOYER1.v12.yaml create mode 100644 tests/fixtures/realworld/positive/refconfigs/AYOGLU1.yaml create mode 100644 tests/fixtures/realworld/positive/tableconfigs/AAMER1.yaml create mode 100644 tests/fixtures/realworld/positive/tableconfigs/ALAM1.yaml create mode 100644 tests/fixtures/realworld/positive/tableconfigs/BRUNDAGE5.yaml create mode 100644 tests/fixtures/realworld/positive/tableconfigs/SILVARODRGUEZ3.yaml create mode 100644 tests/test_production_patterns.py create mode 100644 tests/test_realworld_configs.py diff --git a/tests/fixtures/realworld/README.md b/tests/fixtures/realworld/README.md new file mode 100644 index 0000000..0098abb --- /dev/null +++ b/tests/fixtures/realworld/README.md @@ -0,0 +1,29 @@ +# Real-world config fixtures + +Production configurations vendored from sibling repositories. In every file each +`local:` value was rewritten to `local: payload.placeholder` (validation never reads +payloads); everything else is byte-identical to the source. + +## positive/ + +| File | Source repo | Original path | +|---|---|---| +| `mokg-v12/AYOGLU1.v12.yaml` | MultiomicsNext | `.tablassert/mokg-v12/AYOGLU1.v12.yaml` | +| `mokg-v12/CORREIA3.v12.yaml` | MultiomicsNext | `.tablassert/mokg-v12/CORREIA3.v12.yaml` | +| `mokg-v12/HOYER1.v12.yaml` | MultiomicsNext | `.tablassert/mokg-v12/HOYER1.v12.yaml` | +| `refconfigs/AYOGLU1.yaml` | MultiomicsNext | `.tablassert/refconfigs/AYOGLU1.yaml` | +| `dakp/approved_treats.yaml` | DAKP | `tables/approved_treats.yaml` | +| `dakp/contraindications.yaml` | DAKP | `tables/contraindications.yaml` | +| `dakp/faers_applied_to_treat.yaml` | DAKP | `tables/faers_applied_to_treat.yaml` | +| `dakp/graph.yaml` | DAKP | `tables/graph.yaml` | +| `tableconfigs/AAMER1.yaml` | TableConfigs | `TABLE/FLAKASSIST/AAMER1.yaml` | +| `tableconfigs/ALAM1.yaml` | TableConfigs | `TABLE/MBKG/ALAM1.yaml` | +| `tableconfigs/SILVARODRGUEZ3.yaml` | TableConfigs | `TABLE/FLAKASSIST/SILVARODRGUEZ3.yaml` | +| `tableconfigs/BRUNDAGE5.yaml` | TableConfigs | `TABLE/FLAKASSIST/BRUNDAGE5.yaml` | + +## negative/ (deliberate legacy configs; 12.x must reject them) + +| File | Source repo | Original path | Why rejected | +|---|---|---|---| +| `DRUGIBD.yaml` | TableConfigs | `TABLE/QI/DRUGIBD.yaml` | legacy keys `syntax: TC3`, `status: alpha`, `provenance.contributors` | +| `MOKG.yaml` | TableConfigs | `GRAPH/MOKG.yaml` | legacy graph layout: no `rig:`, top-level `description:` | diff --git a/tests/fixtures/realworld/negative/DRUGIBD.yaml b/tests/fixtures/realworld/negative/DRUGIBD.yaml new file mode 100644 index 0000000..b71a10c --- /dev/null +++ b/tests/fixtures/realworld/negative/DRUGIBD.yaml @@ -0,0 +1,36 @@ +template: + syntax: TC3 + status: alpha + source: + kind: excel + local: payload.placeholder + url: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9439210/bin/pone.0273612.s002.xlsx + sheet: Biological Therapy + row_slice: + - 1 + - auto + statement: + subject: + method: column + encoding: D + prioritize: + - ChemicalEntity + taxon: 9606 + predicate: treats + object: + method: column + encoding: A + prioritize: + - Disease + regex: + - pattern: "^CD$" + replacement: "MONDO:0005011" + - pattern: "^UC$" + replacement: "MONDO:0005101" + provenance: + repo: PMC + publication: PMC9439210 + contributors: + - kind: tool + name: tablassist + date: 06 MAY 2026 diff --git a/tests/fixtures/realworld/negative/MOKG.yaml b/tests/fixtures/realworld/negative/MOKG.yaml new file mode 100644 index 0000000..740f556 --- /dev/null +++ b/tests/fixtures/realworld/negative/MOKG.yaml @@ -0,0 +1,467 @@ +# ? == EMPTY RESULT +# * == UNDESIRABLE RESULT +# TODO: == REQUIRES FEATURE IMPLEMENTATION +# ! == NEEDS TO BE MANUALLY DOWNLOADED + +name: MULTIOMICS_KG +version: 3.0.0 + +description: Placeholder Description +fullmap: /local_raid1/sgoetz/DBSTORE/FULLMAP/fullmap + +tables: + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/AVUTHU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/AVUTHU2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/BLANTON1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/BOHMAN4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/BOMBIN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/BOVERHOFF2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/DIENER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/EDFELDT6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/EDFELDT7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/FACKLE13.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/FORSYTH10.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/FUESS2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/GAGNON5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/GAGNON6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/GOEBERT2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/GOEBERT3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/HABER16.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/HAO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/HILL18.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/HOSKINSON3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/JIN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/KURKOV1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/LUI7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/LUO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/MANOR2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/MANOR4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/MANOR6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/MILLER7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/MOTTA13.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/NAGATA5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/NAGATA7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/NAGATA9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/NAGATA10.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/NAGATA11.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/NGUYEN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/PU12.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/RAVIK9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/ROMERO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/ROMERO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/ROMERO3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/SU3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/SU5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/WANG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/WANG2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/WANG4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/WANG5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/WANG9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/WHIPPER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/WU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/WU18.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/WU19.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/YANG9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/YUAN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/YUN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MBKG/ZHOU29.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/AYOGLU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/CHENG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/CORREIA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/CORREIA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/CORREIA3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/DENG8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/DURAZO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/ELDJARN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/GASPAR2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/HONG8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/HOYER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/HUANG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/HUANG2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/HUANG3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/JIA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/KANEMARU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/LEE1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/MARTINPEREZ1.yaml + # - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/MIN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/MIN4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/MIN5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/QIN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/QIN3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/QIN9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/SUN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/MOKG/WAINBERG3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/RUSSELL1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/JIANG2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MUTZ1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MUTZ2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MUTZ3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MUTZ4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MUTZ5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SONG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BEI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BEI2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOMOZAWA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/OSEI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GOTOH1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SPENDLOVE1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MURRAY1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YU2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FAVIER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHEN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VANPEER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ALBLOOSHI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ALBLOOSHI2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZOU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZOU2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KIM1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KIM2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KIM3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SCZAKIEL1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KIM4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/RASHID1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/RASHID2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/RASHID3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SEABY1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HOP1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HOP2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HE1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/JIANG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LI2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LI3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LI4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LI5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LI6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YU3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/AAMER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CONNALLY1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KLINCOV1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WU2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZOU3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZOU4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZOU5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZOU6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHEN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/NAMBA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHENNEN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOLAEI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SILVARODRGUEZ1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SILVARODRGUEZ2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SILVARODRGUEZ3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG10.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KAISINGER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHAO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHAO3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/NAMBA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PAN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PAN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PAN3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PAN4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PAN5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KRMER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SCHUCH1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/DELCAMPO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SHIL1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GONG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GONG2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GONG3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YANG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YANG2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YANG3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHARALAMPOUS1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/URPA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/URPA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YADIKAR1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YANG4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YANG5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BRUNDAGE1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BRUNDAGE2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BRUNDAGE3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BRUNDAGE4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BRUNDAGE5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/TEBBENKAMP1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/TEBBENKAMP2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/TEBBENKAMP3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/TEBBENKAMP4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/TEBBENKAMP5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/TEBBENKAMP6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CLAUS1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LENG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KOKO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VILARRIB1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VILARRIB2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VILARRIB3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KAMP1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BEBEK1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BEBEK2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ROSENBERGER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ROSENBERGER3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ROSENBERGER4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ROSENBERGER2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ROSENBERGER5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ROSENBERGER6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LENG2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FRIDAY1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/AN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/AN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/AN3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/AN4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YARBRO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YARBRO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KOTMAYER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KOTMAYER2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU10.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHRISTODOULOU11.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/NIKOLAENKO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/NIKOLAENKO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG19.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG20.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG11.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG12.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HUBBELL1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HUBBELL2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HUBBELL3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/RAHMANI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/RAHMANI2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/RAHMANI3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WEN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/QI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/QI2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/QI3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/QI4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG21.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GREIPEL1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAI2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAI3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAI4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAI5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/NIELSEN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/NIELSEN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ROBINSON1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MENG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MENG2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MENG3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG13.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOTELOW1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOTELOW2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOTELOW3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOTELOW4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOTELOW5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOTELOW6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BOONE1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BOONE2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOHAMMADZADEH1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZIELENIEWSKA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZIELENIEWSKA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIAO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIAO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIAO3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIAO4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIAO5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GARCIAURENA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GARCIAURENA3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GARCIAURENA4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GARCIAURENA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHECHI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WU3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WU4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/NATIVIDADAVILA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/NATIVIDADAVILA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MIN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/OU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/OU2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/OU3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/OU4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LEE2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LEE3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SEDLKOV1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SEDLKOV2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/RUSSELL2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHAO4.yaml + # - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHAO5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHAO6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHAO7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHAO8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHAO9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ULLAH1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ULLAH2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FERNANDEZGARCIA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FERNANDEZGARCIA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FERNANDEZGARCIA3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FERNANDEZGARCIA4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GEMICIKARAASLAN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/CHELSKY1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/QU3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/QU4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/XIA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/XIA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/XIA3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/XIA4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GAO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GAO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GAO3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GAO4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HARRIPAUL1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU12.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU13.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU14.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YANG6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YANG7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GAO5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GAO6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GAO7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GAO8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAKUN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAKUN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GUNAWARDENA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GUNAWARDENA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GUNAWARDENA3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GUNAWARDENA4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/GUNAWARDENA5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YU4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YU6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YU5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MONIES1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/DUMAS1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/DUMAS2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/DUMAS3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG22.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG23.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG24.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO10.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PIRRUCCELLO11.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WOZNIAK1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WOZNIAK2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WOZNIAK3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WOZNIAK4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WOZNIAK5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WOZNIAK6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WOZNIAK7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WOZNIAK8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WOZNIAK9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VANHOOIJDONK1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VANHOOIJDONK2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOHALLEM1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOHALLEM2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOHALLEM3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOHALLEM4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MOHALLEM5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PARKER1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PARKER2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PARKER3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PARKER4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PARKER5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/PARKER6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MAYR1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/MAYR2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAI6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAI7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BAI8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/BURAT1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIM1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIM2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIM3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VIOD1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VIOD2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VIOD3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/DAVIDSONSWINTON1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/RAJEH1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/QU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/QU2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/VANNOY1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG25.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HORACKOVA1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/HORACKOVA2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/COBUCCIO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIN3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIN4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LIN1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SHAO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SHAO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SHAOM1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SHAOM2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SHAOM3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SHAOM4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SHAOM5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG26.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/KAISINGER2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SUN2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SUN3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SUN4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SUN5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SUN6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/SUN7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/TENG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/TESI3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/TESI2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LI7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/LI8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/NARUMI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/EGELAND1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/EGELAND2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FORTUNO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FORTUNO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/FORTUNO3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/OMI1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/OMI2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG10.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG11.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG12.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG13.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG14.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG15.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG16.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG17.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/WANG18.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YAO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/YAO2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG3.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHANG8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHAO1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU1.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU2.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU4.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU5.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU6.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU7.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU8.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU9.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU10.yaml + - /local_raid1/sgoetz/STORE/CONFIG/TABLASSERT/TABLE/FLAKASSIST/ZHU11.yaml diff --git a/tests/fixtures/realworld/positive/dakp/approved_treats.yaml b/tests/fixtures/realworld/positive/dakp/approved_treats.yaml new file mode 100644 index 0000000..1698683 --- /dev/null +++ b/tests/fixtures/realworld/positive/dakp/approved_treats.yaml @@ -0,0 +1,361 @@ +template: + source: + kind: text + local: payload.placeholder + url: + - "https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm" + delimiter: "\t" + statement: + subject: + method: column + encoding: A + prioritize: + - Drug + - SmallMolecule + - ChemicalEntity + avoid: + - AccessibleDnaRegion + - Activity + - AdministrativeEntity + - AffinityMeasurement + - Agent + - AnatomicalEntity + - Article + - Attribute + - Bacterium + - Behavior + - BehavioralExposure + - BehavioralFeature + - BiologicalEntity + - BiologicalProcess + - BiologicalProcessOrActivity + - BiologicalSex + - BioticExposure + - Book + - BookChapter + - Case + - Cell + - CellLine + - CellularComponent + - CellularOrganism + - ChemicalExposure + - ChemicalMixture + - ChemicalRole + - ChiSquaredAnalysisResult + - ClinicalAttribute + - ClinicalCourse + - ClinicalEntity + - ClinicalFinding + - ClinicalIntervention + - ClinicalMeasurement + - ClinicalModifier + - ClinicalTrial + - CodingSequence + - Cohort + - CommonDataElement + - ComplexChemicalExposure + - ComplexMolecularMixture + - ConceptCountAnalysisResult + - ConfidenceLevel + - Dataset + - DatasetDistribution + - DatasetSummary + - DatasetVersion + - Device + - DiagnosticAid + - Disease + - DiseaseOrPhenotypicFeature + - DiseaseOrPhenotypicFeatureExposure + - DrugExposure + - DrugLabel + - DrugToGeneInteractionExposure + - Entity + - EnvironmentalExposure + - EnvironmentalFeature + - EnvironmentalFoodContaminant + - EnvironmentalProcess + - Event + - Evidence + - EvidenceType + - Exon + - ExposureEvent + - Food + - FoodAdditive + - Fungus + - Gene + - GeneFamily + - GeneticInheritance + - Genome + - GenomicBackgroundExposure + - Genotype + - GenotypicSex + - GeographicExposure + - GeographicLocation + - GeographicLocationAtTime + - GrossAnatomicalStructure + - Haplotype + - Hospitalization + - Human + - IceesStudyResult + - IndividualOrganism + - InformationContentEntity + - Invertebrate + - JournalArticle + - LifeStage + - LogOddsAnalysisResult + - MacromolecularComplex + - Mammal + - MaterialSample + - MicroRNA + - MolecularActivity + - MolecularEntity + - MolecularMixture + - NamedThing + - NoncodingRNAProduct + - NucleicAcidEntity + - NucleicAcidSequenceMotif + - NucleosomeModification + - ObservedExpectedFrequencyAnalysisResult + - Onset + - OrganismAttribute + - OrganismTaxon + - OrganismalEntity + - Patent + - PathologicalAnatomicalExposure + - PathologicalAnatomicalStructure + - PathologicalProcess + - PathologicalProcessExposure + - Pathway + - Phenomenon + - PhenotypicFeature + - PhenotypicQuality + - PhenotypicSex + - PhysicalEntity + - PhysiologicalProcess + - PlanetaryEntity + - Plant + - Polypeptide + - PopulationOfIndividualOrganisms + - PosttranslationalModification + - PreprintPublication + - Procedure + - ProcessedMaterial + - Protein + - ProteinDomain + - ProteinFamily + - ProteinIsoform + - Publication + - RNAProduct + - RNAProductIsoform + - ReagentTargetedGene + - RegulatoryRegion + - RelativeFrequencyAnalysisResult + - RetrievalSource + - SequenceVariant + - Serial + - SeverityValue + - SiRNA + - Snv + - SocioeconomicAttribute + - SocioeconomicExposure + - Study + - StudyPopulation + - StudyResult + - StudyVariable + - TextMiningStudyResult + - Transcript + - TranscriptionFactorBindingSite + - Treatment + - Vertebrate + - Virus + - WebPage + - Zygosity + predicate: treats + object: + method: column + encoding: F + prioritize: + - Disease + - PhenotypicFeature + avoid: + - AccessibleDnaRegion + - Activity + - AdministrativeEntity + - AffinityMeasurement + - Agent + - AnatomicalEntity + - Article + - Attribute + - Bacterium + - Behavior + - BehavioralExposure + - BehavioralFeature + - BiologicalEntity + - BiologicalProcess + - BiologicalProcessOrActivity + - BiologicalSex + - BioticExposure + - Book + - BookChapter + - Case + - Cell + - CellLine + - CellularComponent + - CellularOrganism + - ChemicalEntity + - ChemicalExposure + - ChemicalMixture + - ChemicalRole + - ChiSquaredAnalysisResult + - ClinicalAttribute + - ClinicalCourse + - ClinicalEntity + - ClinicalFinding + - ClinicalIntervention + - ClinicalMeasurement + - ClinicalModifier + - ClinicalTrial + - CodingSequence + - Cohort + - CommonDataElement + - ComplexChemicalExposure + - ComplexMolecularMixture + - ConceptCountAnalysisResult + - ConfidenceLevel + - Dataset + - DatasetDistribution + - DatasetSummary + - DatasetVersion + - Device + - DiagnosticAid + - DiseaseOrPhenotypicFeature + - DiseaseOrPhenotypicFeatureExposure + - Drug + - DrugExposure + - DrugLabel + - DrugToGeneInteractionExposure + - Entity + - EnvironmentalExposure + - EnvironmentalFeature + - EnvironmentalFoodContaminant + - EnvironmentalProcess + - Event + - Evidence + - EvidenceType + - Exon + - ExposureEvent + - Food + - FoodAdditive + - Fungus + - Gene + - GeneFamily + - GeneticInheritance + - Genome + - GenomicBackgroundExposure + - Genotype + - GenotypicSex + - GeographicExposure + - GeographicLocation + - GeographicLocationAtTime + - GrossAnatomicalStructure + - Haplotype + - Hospitalization + - Human + - IceesStudyResult + - IndividualOrganism + - InformationContentEntity + - Invertebrate + - JournalArticle + - LifeStage + - LogOddsAnalysisResult + - MacromolecularComplex + - Mammal + - MaterialSample + - MicroRNA + - MolecularActivity + - MolecularEntity + - MolecularMixture + - NamedThing + - NoncodingRNAProduct + - NucleicAcidEntity + - NucleicAcidSequenceMotif + - NucleosomeModification + - ObservedExpectedFrequencyAnalysisResult + - Onset + - OrganismAttribute + - OrganismTaxon + - OrganismalEntity + - Patent + - PathologicalAnatomicalExposure + - PathologicalAnatomicalStructure + - PathologicalProcess + - PathologicalProcessExposure + - Pathway + - Phenomenon + - PhenotypicQuality + - PhenotypicSex + - PhysicalEntity + - PhysiologicalProcess + - PlanetaryEntity + - Plant + - Polypeptide + - PopulationOfIndividualOrganisms + - PosttranslationalModification + - PreprintPublication + - Procedure + - ProcessedMaterial + - Protein + - ProteinDomain + - ProteinFamily + - ProteinIsoform + - Publication + - RNAProduct + - RNAProductIsoform + - ReagentTargetedGene + - RegulatoryRegion + - RelativeFrequencyAnalysisResult + - RetrievalSource + - SequenceVariant + - Serial + - SeverityValue + - SiRNA + - SmallMolecule + - Snv + - SocioeconomicAttribute + - SocioeconomicExposure + - Study + - StudyPopulation + - StudyResult + - StudyVariable + - TextMiningStudyResult + - Transcript + - TranscriptionFactorBindingSite + - Treatment + - Vertebrate + - Virus + - WebPage + - Zygosity + provenance: + override: + upstream_resource_ids: + - "infores:dailymed" + - "infores:faers" + upstream_source_record_urls: + infores:dailymed: + - "https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm" + infores:faers: + - "https://fis.fda.gov/extensions/FPD-QDE-FAERS/FPD-QDE-FAERS.html" + knowledge_level: knowledge_assertion + agent_type: manual_validation_of_automated_agent + annotations: + - annotation: approval_ids + method: column + encoding: J + split_by: "|" + - annotation: has_evidence + method: column + encoding: S + split_by: "|" + - annotation: clinical_approval_status + method: column + encoding: N diff --git a/tests/fixtures/realworld/positive/dakp/contraindications.yaml b/tests/fixtures/realworld/positive/dakp/contraindications.yaml new file mode 100644 index 0000000..3fde86f --- /dev/null +++ b/tests/fixtures/realworld/positive/dakp/contraindications.yaml @@ -0,0 +1,528 @@ +template: + source: + kind: text + local: payload.placeholder + url: + - "https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm" + delimiter: "\t" + statement: + subject: + method: column + encoding: A + prioritize: + - Drug + - SmallMolecule + - ChemicalEntity + avoid: + - AccessibleDnaRegion + - Activity + - AdministrativeEntity + - AffinityMeasurement + - Agent + - AnatomicalEntity + - Article + - Attribute + - Bacterium + - Behavior + - BehavioralExposure + - BehavioralFeature + - BiologicalEntity + - BiologicalProcess + - BiologicalProcessOrActivity + - BiologicalSex + - BioticExposure + - Book + - BookChapter + - Case + - Cell + - CellLine + - CellularComponent + - CellularOrganism + - ChemicalExposure + - ChemicalMixture + - ChemicalRole + - ChiSquaredAnalysisResult + - ClinicalAttribute + - ClinicalCourse + - ClinicalEntity + - ClinicalFinding + - ClinicalIntervention + - ClinicalMeasurement + - ClinicalModifier + - ClinicalTrial + - CodingSequence + - Cohort + - CommonDataElement + - ComplexChemicalExposure + - ComplexMolecularMixture + - ConceptCountAnalysisResult + - ConfidenceLevel + - Dataset + - DatasetDistribution + - DatasetSummary + - DatasetVersion + - Device + - DiagnosticAid + - Disease + - DiseaseOrPhenotypicFeature + - DiseaseOrPhenotypicFeatureExposure + - DrugExposure + - DrugLabel + - DrugToGeneInteractionExposure + - Entity + - EnvironmentalExposure + - EnvironmentalFeature + - EnvironmentalFoodContaminant + - EnvironmentalProcess + - Event + - Evidence + - EvidenceType + - Exon + - ExposureEvent + - Food + - FoodAdditive + - Fungus + - Gene + - GeneFamily + - GeneticInheritance + - Genome + - GenomicBackgroundExposure + - Genotype + - GenotypicSex + - GeographicExposure + - GeographicLocation + - GeographicLocationAtTime + - GrossAnatomicalStructure + - Haplotype + - Hospitalization + - Human + - IceesStudyResult + - IndividualOrganism + - InformationContentEntity + - Invertebrate + - JournalArticle + - LifeStage + - LogOddsAnalysisResult + - MacromolecularComplex + - Mammal + - MaterialSample + - MicroRNA + - MolecularActivity + - MolecularEntity + - MolecularMixture + - NamedThing + - NoncodingRNAProduct + - NucleicAcidEntity + - NucleicAcidSequenceMotif + - NucleosomeModification + - ObservedExpectedFrequencyAnalysisResult + - Onset + - OrganismAttribute + - OrganismTaxon + - OrganismalEntity + - Patent + - PathologicalAnatomicalExposure + - PathologicalAnatomicalStructure + - PathologicalProcess + - PathologicalProcessExposure + - Pathway + - Phenomenon + - PhenotypicFeature + - PhenotypicQuality + - PhenotypicSex + - PhysicalEntity + - PhysiologicalProcess + - PlanetaryEntity + - Plant + - Polypeptide + - PopulationOfIndividualOrganisms + - PosttranslationalModification + - PreprintPublication + - Procedure + - ProcessedMaterial + - Protein + - ProteinDomain + - ProteinFamily + - ProteinIsoform + - Publication + - RNAProduct + - RNAProductIsoform + - ReagentTargetedGene + - RegulatoryRegion + - RelativeFrequencyAnalysisResult + - RetrievalSource + - SequenceVariant + - Serial + - SeverityValue + - SiRNA + - Snv + - SocioeconomicAttribute + - SocioeconomicExposure + - Study + - StudyPopulation + - StudyResult + - StudyVariable + - TextMiningStudyResult + - Transcript + - TranscriptionFactorBindingSite + - Treatment + - Vertebrate + - Virus + - WebPage + - Zygosity + predicate: contraindicated_in + object: + method: column + encoding: F + prioritize: + - Disease + - PhenotypicFeature + avoid: + - AccessibleDnaRegion + - Activity + - AdministrativeEntity + - AffinityMeasurement + - Agent + - AnatomicalEntity + - Article + - Attribute + - Bacterium + - Behavior + - BehavioralExposure + - BehavioralFeature + - BiologicalEntity + - BiologicalProcess + - BiologicalProcessOrActivity + - BiologicalSex + - BioticExposure + - Book + - BookChapter + - Case + - Cell + - CellLine + - CellularComponent + - CellularOrganism + - ChemicalEntity + - ChemicalExposure + - ChemicalMixture + - ChemicalRole + - ChiSquaredAnalysisResult + - ClinicalAttribute + - ClinicalCourse + - ClinicalEntity + - ClinicalFinding + - ClinicalIntervention + - ClinicalMeasurement + - ClinicalModifier + - ClinicalTrial + - CodingSequence + - Cohort + - CommonDataElement + - ComplexChemicalExposure + - ComplexMolecularMixture + - ConceptCountAnalysisResult + - ConfidenceLevel + - Dataset + - DatasetDistribution + - DatasetSummary + - DatasetVersion + - Device + - DiagnosticAid + - DiseaseOrPhenotypicFeature + - DiseaseOrPhenotypicFeatureExposure + - Drug + - DrugExposure + - DrugLabel + - DrugToGeneInteractionExposure + - Entity + - EnvironmentalExposure + - EnvironmentalFeature + - EnvironmentalFoodContaminant + - EnvironmentalProcess + - Event + - Evidence + - EvidenceType + - Exon + - ExposureEvent + - Food + - FoodAdditive + - Fungus + - Gene + - GeneFamily + - GeneticInheritance + - Genome + - GenomicBackgroundExposure + - Genotype + - GenotypicSex + - GeographicExposure + - GeographicLocation + - GeographicLocationAtTime + - GrossAnatomicalStructure + - Haplotype + - Hospitalization + - Human + - IceesStudyResult + - IndividualOrganism + - InformationContentEntity + - Invertebrate + - JournalArticle + - LifeStage + - LogOddsAnalysisResult + - MacromolecularComplex + - Mammal + - MaterialSample + - MicroRNA + - MolecularActivity + - MolecularEntity + - MolecularMixture + - NamedThing + - NoncodingRNAProduct + - NucleicAcidEntity + - NucleicAcidSequenceMotif + - NucleosomeModification + - ObservedExpectedFrequencyAnalysisResult + - Onset + - OrganismAttribute + - OrganismTaxon + - OrganismalEntity + - Patent + - PathologicalAnatomicalExposure + - PathologicalAnatomicalStructure + - PathologicalProcess + - PathologicalProcessExposure + - Pathway + - Phenomenon + - PhenotypicQuality + - PhenotypicSex + - PhysicalEntity + - PhysiologicalProcess + - PlanetaryEntity + - Plant + - Polypeptide + - PopulationOfIndividualOrganisms + - PosttranslationalModification + - PreprintPublication + - Procedure + - ProcessedMaterial + - Protein + - ProteinDomain + - ProteinFamily + - ProteinIsoform + - Publication + - RNAProduct + - RNAProductIsoform + - ReagentTargetedGene + - RegulatoryRegion + - RelativeFrequencyAnalysisResult + - RetrievalSource + - SequenceVariant + - Serial + - SeverityValue + - SiRNA + - SmallMolecule + - Snv + - SocioeconomicAttribute + - SocioeconomicExposure + - Study + - StudyPopulation + - StudyResult + - StudyVariable + - TextMiningStudyResult + - Transcript + - TranscriptionFactorBindingSite + - Treatment + - Vertebrate + - Virus + - WebPage + - Zygosity + qualifiers: + - qualifier: disease_context_qualifier + method: column + encoding: J + nullable: true + prioritize: + - Disease + avoid: + - AccessibleDnaRegion + - Activity + - AdministrativeEntity + - AffinityMeasurement + - Agent + - AnatomicalEntity + - Article + - Attribute + - Bacterium + - Behavior + - BehavioralExposure + - BehavioralFeature + - BiologicalEntity + - BiologicalProcess + - BiologicalProcessOrActivity + - BiologicalSex + - BioticExposure + - Book + - BookChapter + - Case + - Cell + - CellLine + - CellularComponent + - CellularOrganism + - ChemicalEntity + - ChemicalExposure + - ChemicalMixture + - ChemicalRole + - ChiSquaredAnalysisResult + - ClinicalAttribute + - ClinicalCourse + - ClinicalEntity + - ClinicalFinding + - ClinicalIntervention + - ClinicalMeasurement + - ClinicalModifier + - ClinicalTrial + - CodingSequence + - Cohort + - CommonDataElement + - ComplexChemicalExposure + - ComplexMolecularMixture + - ConceptCountAnalysisResult + - ConfidenceLevel + - Dataset + - DatasetDistribution + - DatasetSummary + - DatasetVersion + - Device + - DiagnosticAid + - DiseaseOrPhenotypicFeature + - DiseaseOrPhenotypicFeatureExposure + - Drug + - DrugExposure + - DrugLabel + - DrugToGeneInteractionExposure + - Entity + - EnvironmentalExposure + - EnvironmentalFeature + - EnvironmentalFoodContaminant + - EnvironmentalProcess + - Event + - Evidence + - EvidenceType + - Exon + - ExposureEvent + - Food + - FoodAdditive + - Fungus + - Gene + - GeneFamily + - GeneticInheritance + - Genome + - GenomicBackgroundExposure + - Genotype + - GenotypicSex + - GeographicExposure + - GeographicLocation + - GeographicLocationAtTime + - GrossAnatomicalStructure + - Haplotype + - Hospitalization + - Human + - IceesStudyResult + - IndividualOrganism + - InformationContentEntity + - Invertebrate + - JournalArticle + - LifeStage + - LogOddsAnalysisResult + - MacromolecularComplex + - Mammal + - MaterialSample + - MicroRNA + - MolecularActivity + - MolecularEntity + - MolecularMixture + - NamedThing + - NoncodingRNAProduct + - NucleicAcidEntity + - NucleicAcidSequenceMotif + - NucleosomeModification + - ObservedExpectedFrequencyAnalysisResult + - Onset + - OrganismAttribute + - OrganismTaxon + - OrganismalEntity + - Patent + - PathologicalAnatomicalExposure + - PathologicalAnatomicalStructure + - PathologicalProcess + - PathologicalProcessExposure + - Pathway + - Phenomenon + - PhenotypicFeature + - PhenotypicQuality + - PhenotypicSex + - PhysicalEntity + - PhysiologicalProcess + - PlanetaryEntity + - Plant + - Polypeptide + - PopulationOfIndividualOrganisms + - PosttranslationalModification + - PreprintPublication + - Procedure + - ProcessedMaterial + - Protein + - ProteinDomain + - ProteinFamily + - ProteinIsoform + - Publication + - RNAProduct + - RNAProductIsoform + - ReagentTargetedGene + - RegulatoryRegion + - RelativeFrequencyAnalysisResult + - RetrievalSource + - SequenceVariant + - Serial + - SeverityValue + - SiRNA + - SmallMolecule + - Snv + - SocioeconomicAttribute + - SocioeconomicExposure + - Study + - StudyPopulation + - StudyResult + - StudyVariable + - TextMiningStudyResult + - Transcript + - TranscriptionFactorBindingSite + - Treatment + - Vertebrate + - Virus + - WebPage + - Zygosity + provenance: + override: + upstream_resource_ids: + - "infores:dailymed" + upstream_source_record_urls: + infores:dailymed: + - "https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm" + knowledge_level: knowledge_assertion + agent_type: text_mining_agent + annotations: + - annotation: approval_ids + method: column + encoding: T + split_by: "|" + - annotation: has_evidence + method: column + encoding: U + split_by: "|" + - annotation: supporting_text + method: column + encoding: K + split_by: "|" + - annotation: source_score + method: column + encoding: O diff --git a/tests/fixtures/realworld/positive/dakp/faers_applied_to_treat.yaml b/tests/fixtures/realworld/positive/dakp/faers_applied_to_treat.yaml new file mode 100644 index 0000000..40fbcbd --- /dev/null +++ b/tests/fixtures/realworld/positive/dakp/faers_applied_to_treat.yaml @@ -0,0 +1,364 @@ +template: + source: + kind: text + local: payload.placeholder + url: + - "https://fis.fda.gov/extensions/FPD-QDE-FAERS/FPD-QDE-FAERS.html" + delimiter: "\t" + statement: + subject: + method: column + encoding: A + prioritize: + - Drug + - SmallMolecule + - ChemicalEntity + avoid: + - AccessibleDnaRegion + - Activity + - AdministrativeEntity + - AffinityMeasurement + - Agent + - AnatomicalEntity + - Article + - Attribute + - Bacterium + - Behavior + - BehavioralExposure + - BehavioralFeature + - BiologicalEntity + - BiologicalProcess + - BiologicalProcessOrActivity + - BiologicalSex + - BioticExposure + - Book + - BookChapter + - Case + - Cell + - CellLine + - CellularComponent + - CellularOrganism + - ChemicalExposure + - ChemicalMixture + - ChemicalRole + - ChiSquaredAnalysisResult + - ClinicalAttribute + - ClinicalCourse + - ClinicalEntity + - ClinicalFinding + - ClinicalIntervention + - ClinicalMeasurement + - ClinicalModifier + - ClinicalTrial + - CodingSequence + - Cohort + - CommonDataElement + - ComplexChemicalExposure + - ComplexMolecularMixture + - ConceptCountAnalysisResult + - ConfidenceLevel + - Dataset + - DatasetDistribution + - DatasetSummary + - DatasetVersion + - Device + - DiagnosticAid + - Disease + - DiseaseOrPhenotypicFeature + - DiseaseOrPhenotypicFeatureExposure + - DrugExposure + - DrugLabel + - DrugToGeneInteractionExposure + - Entity + - EnvironmentalExposure + - EnvironmentalFeature + - EnvironmentalFoodContaminant + - EnvironmentalProcess + - Event + - Evidence + - EvidenceType + - Exon + - ExposureEvent + - Food + - FoodAdditive + - Fungus + - Gene + - GeneFamily + - GeneticInheritance + - Genome + - GenomicBackgroundExposure + - Genotype + - GenotypicSex + - GeographicExposure + - GeographicLocation + - GeographicLocationAtTime + - GrossAnatomicalStructure + - Haplotype + - Hospitalization + - Human + - IceesStudyResult + - IndividualOrganism + - InformationContentEntity + - Invertebrate + - JournalArticle + - LifeStage + - LogOddsAnalysisResult + - MacromolecularComplex + - Mammal + - MaterialSample + - MicroRNA + - MolecularActivity + - MolecularEntity + - MolecularMixture + - NamedThing + - NoncodingRNAProduct + - NucleicAcidEntity + - NucleicAcidSequenceMotif + - NucleosomeModification + - ObservedExpectedFrequencyAnalysisResult + - Onset + - OrganismAttribute + - OrganismTaxon + - OrganismalEntity + - Patent + - PathologicalAnatomicalExposure + - PathologicalAnatomicalStructure + - PathologicalProcess + - PathologicalProcessExposure + - Pathway + - Phenomenon + - PhenotypicFeature + - PhenotypicQuality + - PhenotypicSex + - PhysicalEntity + - PhysiologicalProcess + - PlanetaryEntity + - Plant + - Polypeptide + - PopulationOfIndividualOrganisms + - PosttranslationalModification + - PreprintPublication + - Procedure + - ProcessedMaterial + - Protein + - ProteinDomain + - ProteinFamily + - ProteinIsoform + - Publication + - RNAProduct + - RNAProductIsoform + - ReagentTargetedGene + - RegulatoryRegion + - RelativeFrequencyAnalysisResult + - RetrievalSource + - SequenceVariant + - Serial + - SeverityValue + - SiRNA + - Snv + - SocioeconomicAttribute + - SocioeconomicExposure + - Study + - StudyPopulation + - StudyResult + - StudyVariable + - TextMiningStudyResult + - Transcript + - TranscriptionFactorBindingSite + - Treatment + - Vertebrate + - Virus + - WebPage + - Zygosity + predicate: applied_to_treat + object: + method: column + encoding: F + prioritize: + - Disease + - PhenotypicFeature + avoid: + - AccessibleDnaRegion + - Activity + - AdministrativeEntity + - AffinityMeasurement + - Agent + - AnatomicalEntity + - Article + - Attribute + - Bacterium + - Behavior + - BehavioralExposure + - BehavioralFeature + - BiologicalEntity + - BiologicalProcess + - BiologicalProcessOrActivity + - BiologicalSex + - BioticExposure + - Book + - BookChapter + - Case + - Cell + - CellLine + - CellularComponent + - CellularOrganism + - ChemicalEntity + - ChemicalExposure + - ChemicalMixture + - ChemicalRole + - ChiSquaredAnalysisResult + - ClinicalAttribute + - ClinicalCourse + - ClinicalEntity + - ClinicalFinding + - ClinicalIntervention + - ClinicalMeasurement + - ClinicalModifier + - ClinicalTrial + - CodingSequence + - Cohort + - CommonDataElement + - ComplexChemicalExposure + - ComplexMolecularMixture + - ConceptCountAnalysisResult + - ConfidenceLevel + - Dataset + - DatasetDistribution + - DatasetSummary + - DatasetVersion + - Device + - DiagnosticAid + - DiseaseOrPhenotypicFeature + - DiseaseOrPhenotypicFeatureExposure + - Drug + - DrugExposure + - DrugLabel + - DrugToGeneInteractionExposure + - Entity + - EnvironmentalExposure + - EnvironmentalFeature + - EnvironmentalFoodContaminant + - EnvironmentalProcess + - Event + - Evidence + - EvidenceType + - Exon + - ExposureEvent + - Food + - FoodAdditive + - Fungus + - Gene + - GeneFamily + - GeneticInheritance + - Genome + - GenomicBackgroundExposure + - Genotype + - GenotypicSex + - GeographicExposure + - GeographicLocation + - GeographicLocationAtTime + - GrossAnatomicalStructure + - Haplotype + - Hospitalization + - Human + - IceesStudyResult + - IndividualOrganism + - InformationContentEntity + - Invertebrate + - JournalArticle + - LifeStage + - LogOddsAnalysisResult + - MacromolecularComplex + - Mammal + - MaterialSample + - MicroRNA + - MolecularActivity + - MolecularEntity + - MolecularMixture + - NamedThing + - NoncodingRNAProduct + - NucleicAcidEntity + - NucleicAcidSequenceMotif + - NucleosomeModification + - ObservedExpectedFrequencyAnalysisResult + - Onset + - OrganismAttribute + - OrganismTaxon + - OrganismalEntity + - Patent + - PathologicalAnatomicalExposure + - PathologicalAnatomicalStructure + - PathologicalProcess + - PathologicalProcessExposure + - Pathway + - Phenomenon + - PhenotypicQuality + - PhenotypicSex + - PhysicalEntity + - PhysiologicalProcess + - PlanetaryEntity + - Plant + - Polypeptide + - PopulationOfIndividualOrganisms + - PosttranslationalModification + - PreprintPublication + - Procedure + - ProcessedMaterial + - Protein + - ProteinDomain + - ProteinFamily + - ProteinIsoform + - Publication + - RNAProduct + - RNAProductIsoform + - ReagentTargetedGene + - RegulatoryRegion + - RelativeFrequencyAnalysisResult + - RetrievalSource + - SequenceVariant + - Serial + - SeverityValue + - SiRNA + - SmallMolecule + - Snv + - SocioeconomicAttribute + - SocioeconomicExposure + - Study + - StudyPopulation + - StudyResult + - StudyVariable + - TextMiningStudyResult + - Transcript + - TranscriptionFactorBindingSite + - Treatment + - Vertebrate + - Virus + - WebPage + - Zygosity + provenance: + override: + upstream_resource_ids: + - "infores:faers" + - "infores:dailymed" + upstream_source_record_urls: + infores:faers: + - "https://fis.fda.gov/extensions/FPD-QDE-FAERS/FPD-QDE-FAERS.html" + infores:dailymed: + - "https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm" + knowledge_level: observation + agent_type: manual_validation_of_automated_agent + annotations: + - annotation: evidence_count + method: column + encoding: J + - annotation: approval_ids + method: column + encoding: P + split_by: "|" + - annotation: has_evidence + method: column + encoding: Q + split_by: "|" + - annotation: clinical_approval_status + method: column + encoding: K diff --git a/tests/fixtures/realworld/positive/dakp/graph.yaml b/tests/fixtures/realworld/positive/dakp/graph.yaml new file mode 100644 index 0000000..91fd258 --- /dev/null +++ b/tests/fixtures/realworld/positive/dakp/graph.yaml @@ -0,0 +1,170 @@ +name: DRUG_APPROVALS_KP +version: "1.0.0" +fullmap: ".fullmap" +rig: + supporting_data_source_info: + - infores_id: "infores:dailymed" + name: DailyMed + description: >- + DailyMed provides trustworthy information about marketed drugs in the + United States, based on FDA Structured Product Labeling (SPL) + documents. DAKP uses DailyMed to identify FDA-approved drug-indication + and drug-contraindication relationships. + terms_of_use_info: + terms_of_use_url: "https://dailymed.nlm.nih.gov/dailymed/" + terms_of_use_description: "DailyMed data are freely available and in the public domain." + relevant_files: + - file_name: "DailyMed Structured Product Labeling" + location: "https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm" + description: >- + Structured product labeling (SPL) documents for FDA-approved drugs + - infores_id: "infores:faers" + name: "FDA Adverse Event Reporting System (FAERS)" + description: >- + FAERS contains adverse event reports, medication error reports, and + product quality complaints submitted to the FDA. DAKP uses FAERS to + derive drug-disease usage relationships and case counts, including + on-label and off-label use. + terms_of_use_info: + terms_of_use_url: "https://www.fda.gov/drugs/questions-and-answers-fdas-adverse-event-reporting-system-faers/fda-adverse-event-reporting-system-faers-quarterly-data-extract-files" + terms_of_use_description: >- + FAERS data files are in the public domain and freely available for + download. + relevant_files: + - file_name: "FAERS Quarterly Data Files" + location: "https://fis.fda.gov/extensions/FPD-QDE-FAERS/FPD-QDE-FAERS.html" + description: "Quarterly data files containing adverse event reports" + source_info: + infores_id: "infores:multiomics-drugapprovals" + name: "Drug Approvals Knowledge Provider (DAKP)" + description: >- + Drug Approvals Knowledge Provider: FDA-approved treatment + relationships, FAERS-observed applied-to-treat uses, and + contraindications text-mined from DailyMed, modeled from DailyMed, + Drugs@FDA, and FAERS. Every edge carries the evidence identifiers + backing it; approved-treats edges also carry clinical approval status + and FDA application numbers, FAERS-observed use edges add case counts, + and contraindication edges carry application numbers where available + plus the evidence prose backing them. + citations: + - "Generating Biomedical Knowledge Graphs from Knowledge Bases, Registries, and Multiomic Data (preprint): https://pmc.ncbi.nlm.nih.gov/articles/PMC11601480/" + terms_of_use_info: + terms_of_use_url: "https://www.nlm.nih.gov/terms.html" + terms_of_use_description: >- + DAKP is derived from DailyMed (NLM), Drugs@FDA, and FAERS (FDA) — US + government public-domain data; the NLM and FDA terms of use apply. + data_access_locations: + - "DailyMed SPL releases - https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm" + - "FAERS quarterly ASCII extracts - https://fis.fda.gov/extensions/FPD-QDE-FAERS/FPD-QDE-FAERS.html" + - "Drugs@FDA data files - https://www.fda.gov/media/89850/download" + data_provision_mechanisms: + - file_download + data_formats: + - kgx + data_versioning_and_releases: >- + DAKP versions follow the Python package version (pyproject.toml, + currently 1.0.0); every build embeds it in the graph config via + graph_config(version=...). Re-ingests track the upstream cadence: + FAERS quarterly ASCII extracts and DailyMed SPL releases. DailyMed and + Drugs@FDA re-downloads are freshness-gated to a 7-day cache window; + FAERS downloads are content-addressed and cache-first, with no age + gate. + source_status: maintained_regular_updates + ingest_info: + ingest_categories: + - translator_knowledge_creator + utility: >- + Provides FDA-approved drug-disease treatment relationships, + FAERS-observed applied-to-treat uses, and SPL-mined contraindications + for Translator querying. + scope: >- + Approved-treats edges (DailyMed SPL indications joined to Drugs@FDA + applications and FAERS cases), FAERS observed-use edges, and + contraindication edges text-mined from DailyMed SPL sections; all + other content of the upstream feeds is out of scope. + relevant_files: + - file_name: "DailyMed full-release SPL zips" + location: "https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm" + description: >- + Structured Product Labeling XML releases; + indications/contraindications sections and approval numbers. + - file_name: "FAERS quarterly ASCII zips" + location: "https://fis.fda.gov/extensions/FPD-QDE-FAERS/FPD-QDE-FAERS.html" + description: >- + FDA Adverse Event Reporting System quarterly extracts; drug/indication + case pairs. + included_content: + - file_name: "DailyMed SPL sections" + included_records: >- + indications_and_usage (LOINC 34067-9), contraindications (LOINC + 34070-3), boxed warnings (LOINC 34066-1), and warnings/precautions + (LOINC 43685-7, legacy 34071-1/42232-9) sections; FDA application + numbers are carried as provenance where available + fields_used: >- + indications_and_usage, contraindications, boxed-warning, and + warnings/precautions section text, SPL set identifiers, FDA + application numbers + - file_name: "FAERS quarterly ASCII zips" + included_records: "drug/indication case pairs; case counts" + filtered_content: + - file_name: "DailyMed SPL indication sections" + filtered_records: >- + indication sections on SPL sets whose NDA lacks a DailyMed SPL + approval + rationale: >- + approved-treats assertions require an FDA approval backing the + indication; observed-use and text-mined contraindication assertions + are deliberately not approval-gated + - file_name: "DailyMed SPL sections" + filtered_records: >- + all SPL sections other than indications_and_usage (LOINC 34067-9), + contraindications (LOINC 34070-3), boxed warnings (LOINC 34066-1), and + warnings/precautions (LOINC 43685-7, legacy 34071-1/42232-9) + rationale: >- + the remaining sections carry no treatment or contraindication evidence + future_considerations: + - category: edge_content + consideration: >- + A drug-drug chemical-entity interaction assertion for medication + context (currently the disease_context_qualifier is intentionally + disease-only; medications belong in a future interaction assertion) + relevant_files: "DailyMed SPL contraindication sections" + - category: edge_property_content + consideration: >- + clinical_approval_status is a first-class Biolink + ClinicalApprovalStatusEnum field, so values outside the enum cannot be + preserved: the legacy FAERS observed_use status is coerced to + not_provided (degraded mode). Revisit if Biolink adds a dedicated + observation status. + target_info: + future_considerations: + - category: qualifiers + consideration: >- + disease_context_qualifier is intentionally disease-only and + sparse-nullable; revisit when a chemical-entity interaction assertion + exists + - category: edge_properties + consideration: >- + approval_ids stays a curated top-level edge field (Tablassert >= 12 + carve-out); monitor whether Biolink gains a standard slot for FDA + application numbers + additional_notes: + - "Node and edge type summaries are generated by Tablassert from the observed build, not authored in this configuration." + provenance_info: + contributions: + - "Gwenlyn Glusman - code author, domain expertise, data modeling" + - "Matthew Brush - data modeling" + - "Sierra Moxon - code, data modeling" + - "Skye Lane Goetz - code author, pipeline engineering, Tablassert integration" + - "DAKP pipeline (https://github.com/glusman-team/dakp): source acquisition, assertion modeling" + - "Tablassert: KGX and RIG generation" + artifacts: + - "DAKP pipeline repository: https://github.com/glusman-team/dakp" + - "Upstream DINGO-reviewed DAKP RIG: https://github.com/NCATSTranslator/translator-ingests/blob/main/src/translator_ingest/ingests/dakp/dakp_rig.yaml" + - "RIG review issue: https://github.com/NCATSTranslator/translator-ingests/issues/416" + artifact_base_url: "https://github.com/glusman-team/dakp" + artifact_base_path: data +tables: + - tables/approved_treats.yaml + - tables/faers_applied_to_treat.yaml + - tables/contraindications.yaml diff --git a/tests/fixtures/realworld/positive/mokg-v12/AYOGLU1.v12.yaml b/tests/fixtures/realworld/positive/mokg-v12/AYOGLU1.v12.yaml new file mode 100644 index 0000000..58796b7 --- /dev/null +++ b/tests/fixtures/realworld/positive/mokg-v12/AYOGLU1.v12.yaml @@ -0,0 +1,56 @@ +template: + provenance: + repo: PMC + publication: PMC4119355 +sections: +- source: + kind: excel + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC4119355.1/emmm0006-0918-SD18.xlsx + local: payload.placeholder + sheet: Ordered Score for p values + row_slice: + - 3 + - auto + statement: + subject: + method: value + encoding: Duchenne muscular dystrophy + prioritize: + - Disease + predicate: correlated_with + object: + method: column + encoding: C + prioritize: + - Protein + - Gene + taxon: 9606 + regex: + - pattern: ^\s+|\s+$ + replacement: '' + remove: + - -Ab#?\\d+$ + - '#.*' + annotations: + - annotation: sample_size + method: value + encoding: 78 + - annotation: multiple_testing_correction_method + method: value + encoding: none + - annotation: assertion_method + method: value + encoding: "nonparametric Wilcoxon rank-sum and Kruskal\u2013Wallis tests" + - annotation: notes + method: value + encoding: antibody bead array platform with 384 antibodies + - annotation: p_value + method: column + encoding: I + - annotation: effect_size + method: column + encoding: D + - annotation: miscellaneous notes + method: value + encoding: antibody bead array platform with 384 antibodies diff --git a/tests/fixtures/realworld/positive/mokg-v12/CORREIA3.v12.yaml b/tests/fixtures/realworld/positive/mokg-v12/CORREIA3.v12.yaml new file mode 100644 index 0000000..c17bb85 --- /dev/null +++ b/tests/fixtures/realworld/positive/mokg-v12/CORREIA3.v12.yaml @@ -0,0 +1,302 @@ +template: + provenance: + repo: PMC + publication: PMC11530135 +sections: +- source: + kind: excel + local: payload.placeholder + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC11530135.1/jciinsight-9-178645-s132.xlsx + row_slice: + - 1 + - auto + sheet: Fig. 3A + statement: + predicate: correlated_with + subject: + method: column + encoding: B + prefix: 'UniProtKB:' + prioritize: + - Protein + - Gene + taxon: 9606 + object: + method: value + encoding: mitochondrial disease + prioritize: + - Disease + annotations: + - annotation: sample size + method: value + encoding: 84 + - annotation: multiple testing correction method + method: value + encoding: Benjamini-Hochberg method + - annotation: miscellaneous notes + method: value + encoding: Quantitative proteomics of patient fibroblasts reveal biomarkers and + diagnostic signatures of mitochondrial disease. correia3 may have overlaps with + correia1 and correia2 as the authors may have reported the same data in supplemental + tables and in supplemental data for the main article figures. + - annotation: p value + method: column + encoding: D + - annotation: effect_size + method: column + encoding: C + - annotation: assertion method + method: value + encoding: linear model for differential expression (DE analysis using the limma + package in R) +- source: + kind: excel + local: payload.placeholder + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC11530135.1/jciinsight-9-178645-s132.xlsx + row_slice: + - 1 + - auto + sheet: Fig. 3B + statement: + predicate: correlated_with + subject: + method: column + encoding: A + prefix: 'UniProtKB:' + prioritize: + - Protein + - Gene + taxon: 9606 + object: + method: value + encoding: mitochondrial oxidative phosphorylation disorder + prioritize: + - Disease + annotations: + - annotation: sample size + method: value + encoding: 84 + - annotation: multiple testing correction method + method: value + encoding: Benjamini-Hochberg method + - annotation: miscellaneous notes + method: value + encoding: Quantitative proteomics of patient fibroblasts reveal biomarkers and + diagnostic signatures of mitochondrial disease. correia3 may have overlaps with + correia1 and correia2 as the authors may have reported the same data in supplemental + tables and in supplemental data for the main article figures. + - annotation: p value + method: column + encoding: D + - annotation: effect_size + method: column + encoding: C + - annotation: assertion method + method: value + encoding: linear model for differential expression (DE analysis using the limma + package in R) +- source: + kind: excel + local: payload.placeholder + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC11530135.1/jciinsight-9-178645-s132.xlsx + row_slice: + - 1 + - auto + sheet: Fig. 3F + statement: + predicate: correlated_with + subject: + method: column + encoding: A + prioritize: + - Protein + - Gene + taxon: 9606 + prefix: 'UniProtKB:' + object: + method: value + encoding: mitochondrial oxidative phosphorylation disorder + prioritize: + - Disease + annotations: + - annotation: sample size + method: value + encoding: 84 + - annotation: multiple testing correction method + method: value + encoding: Benjamini-Hochberg method + - annotation: miscellaneous notes + method: value + encoding: Quantitative proteomics of patient fibroblasts reveal biomarkers and + diagnostic signatures of mitochondrial disease. correia3 may have overlaps with + correia1 and correia2 as the authors may have reported the same data in supplemental + tables and in supplemental data for the main article figures. + - annotation: p value + method: column + encoding: D + - annotation: effect_size + method: column + encoding: C + - annotation: assertion method + method: value + encoding: linear model for differential expression (DE analysis using the limma + package in R) +- source: + kind: excel + local: payload.placeholder + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC11530135.1/jciinsight-9-178645-s132.xlsx + row_slice: + - 1 + - auto + sheet: Fig. 4A + statement: + predicate: correlated_with + subject: + method: column + encoding: A + prioritize: + - Pathway + - MolecularActivity + - BiologicalProcess + taxon: 9606 + regex: + - pattern: ^WP + replacement: WIKIPATHWAYS:WP + - pattern: ^R-HSA- + replacement: REACT:R-HSA- + object: + method: value + encoding: mitochondrial disease + prioritize: + - Disease + annotations: + - annotation: sample size + method: value + encoding: 84 + - annotation: multiple testing correction method + method: value + encoding: Benjamini-Hochberg method + - annotation: miscellaneous notes + method: value + encoding: Quantitative proteomics of patient fibroblasts reveal biomarkers and + diagnostic signatures of mitochondrial disease. correia3 may have overlaps with + correia1 and correia2 as the authors may have reported the same data in supplemental + tables and in supplemental data for the main article figures. + - annotation: p value + method: column + encoding: E + - annotation: effect_size + method: column + encoding: D + - annotation: assertion method + method: value + encoding: Gene set enrichment analysis (GSEA), using consensus pathway annotation + catalogues +- source: + kind: excel + local: payload.placeholder + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC11530135.1/jciinsight-9-178645-s132.xlsx + row_slice: + - 1 + - auto + sheet: Fig. 4B + statement: + predicate: correlated_with + subject: + method: column + encoding: A + prioritize: + - Pathway + - BiologicalProcess + - MolecularActivity + taxon: 9606 + regex: + - pattern: ^WP + replacement: WIKIPATHWAYS:WP + - pattern: ^R-HSA- + replacement: REACT:R-HSA- + object: + method: value + encoding: mitochondrial oxidative phosphorylation disorder + prioritize: + - Disease + annotations: + - annotation: sample size + method: value + encoding: 84 + - annotation: multiple testing correction method + method: value + encoding: Benjamini-Hochberg method + - annotation: miscellaneous notes + method: value + encoding: Quantitative proteomics of patient fibroblasts reveal biomarkers and + diagnostic signatures of mitochondrial disease. correia3 may have overlaps with + correia1 and correia2 as the authors may have reported the same data in supplemental + tables and in supplemental data for the main article figures. + - annotation: p value + method: column + encoding: E + - annotation: effect_size + method: column + encoding: D + - annotation: assertion method + method: value + encoding: Gene set enrichment analysis (GSEA), using consensus pathway annotation + catalogues +- source: + kind: excel + local: payload.placeholder + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC11530135.1/jciinsight-9-178645-s132.xlsx + row_slice: + - 1 + - auto + sheet: Fig. 4D + statement: + predicate: correlated_with + subject: + method: column + encoding: A + prioritize: + - Pathway + - BiologicalProcess + - MolecularActivity + taxon: 9606 + regex: + - pattern: ^WP + replacement: WIKIPATHWAYS:WP + - pattern: ^R-HSA- + replacement: REACT:R-HSA- + object: + method: value + encoding: mitochondrial oxidative phosphorylation disorder + prioritize: + - Disease + annotations: + - annotation: sample size + method: value + encoding: 84 + - annotation: multiple testing correction method + method: value + encoding: Benjamini-Hochberg method + - annotation: miscellaneous notes + method: value + encoding: Quantitative proteomics of patient fibroblasts reveal biomarkers and + diagnostic signatures of mitochondrial disease. correia3 may have overlaps with + correia1 and correia2 as the authors may have reported the same data in supplemental + tables and in supplemental data for the main article figures. + - annotation: p value + method: column + encoding: E + - annotation: effect_size + method: column + encoding: D + - annotation: assertion method + method: value + encoding: Gene set enrichment analysis (GSEA), using consensus pathway annotation + catalogues diff --git a/tests/fixtures/realworld/positive/mokg-v12/HOYER1.v12.yaml b/tests/fixtures/realworld/positive/mokg-v12/HOYER1.v12.yaml new file mode 100644 index 0000000..c938112 --- /dev/null +++ b/tests/fixtures/realworld/positive/mokg-v12/HOYER1.v12.yaml @@ -0,0 +1,61 @@ +template: + provenance: + repo: PMC + publication: PMC9377087 +sections: +- source: + kind: excel + local: payload.placeholder + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC9377087.1/12883_2022_2828_MOESM4_ESM.xls + sheet: Sheet 1 + row_slice: + - 3 + - auto + statement: + subject: + method: column + encoding: A + prioritize: + - Pathway + - MolecularActivity + - BiologicalProcess + taxon: 9606 + predicate: associated_with + object: + method: value + encoding: MONDO:0015626 + prioritize: + - Disease + qualifiers: + - qualifier: disease_context_qualifier + method: value + encoding: MONDO:0015626 + annotations: + - annotation: negative log p value + method: column + encoding: B + - annotation: enrichment ratio + method: column + encoding: C + - annotation: z-score + method: column + encoding: D + - annotation: sample size + method: value + encoding: 9 + - annotation: assertion method + method: value + encoding: Ingenuity Pathway Analysis + - annotation: multiple testing correction method + method: value + encoding: none + - annotation: miscellaneous notes + method: value + encoding: 'Ingenuity Pathway Analysis canonical pathways enrichment from PBMC + proteomic comparison of 4 CMT-affected vs 5 healthy family members with the + AARS1 Arg326Trp mutation. Column B is -log10(p-value) from Fisher''s exact test. + Column C is the enrichment ratio. Column D is the IPA activation z-score (positive + = activated, negative = inhibited, blank = no prediction). + + ' diff --git a/tests/fixtures/realworld/positive/refconfigs/AYOGLU1.yaml b/tests/fixtures/realworld/positive/refconfigs/AYOGLU1.yaml new file mode 100644 index 0000000..d2eaf9f --- /dev/null +++ b/tests/fixtures/realworld/positive/refconfigs/AYOGLU1.yaml @@ -0,0 +1,54 @@ +template: + provenance: &id001 + repo: PMC + publication: PMC4119355 +sections: +- source: + kind: excel + url: + - https://pmc.ncbi.nlm.nih.gov/articles/instance/4119355/bin/emmm0006-0918-SD18.xlsx + local: payload.placeholder + sheet: Ordered Score for p values + row_slice: + - 3 + - auto + statement: + subject: + method: value + encoding: Duchenne muscular dystrophy + prioritize: + - Disease + predicate: correlated_with + object: + method: column + encoding: C + prioritize: + - Protein + - Gene + taxon: 9606 + regex: + - pattern: ^\s+|\s+$ + replacement: '' + remove: + - -Ab#?\\d+$ + - '#.*' + provenance: *id001 + annotations: + - annotation: sample_size + method: value + encoding: 78 + - annotation: multiple_testing_correction_method + method: value + encoding: none + - annotation: assertion_method + method: value + encoding: "nonparametric Wilcoxon rank-sum and Kruskal\u2013Wallis tests" + - annotation: notes + method: value + encoding: antibody bead array platform with 384 antibodies + - annotation: p_value + method: column + encoding: I + - annotation: miscellaneous notes + method: value + encoding: antibody bead array platform with 384 antibodies diff --git a/tests/fixtures/realworld/positive/tableconfigs/AAMER1.yaml b/tests/fixtures/realworld/positive/tableconfigs/AAMER1.yaml new file mode 100644 index 0000000..2654b8f --- /dev/null +++ b/tests/fixtures/realworld/positive/tableconfigs/AAMER1.yaml @@ -0,0 +1,65 @@ +template: + source: + kind: excel + local: payload.placeholder + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC11000384.1/13073_2024_1307_MOESM1_ESM.xlsx + sheet: Table S3 + row_slice: + - 2 + - auto + statement: + subject: + method: column + encoding: A + taxon: 9606 + prioritize: + - Gene + predicate: gene_associated_with_condition + object: + method: column + encoding: AN + explode_by: ; + prefix: "OMIM:" + remove: + - ^\.$ + provenance: + repo: PMC + publication: PMC11000384 + annotations: + - annotation: variant_identifier + method: column + encoding: B + - annotation: chromosome + method: column + encoding: D + - annotation: position_hg19 + method: column + encoding: E + - annotation: reference_allele + method: column + encoding: F + - annotation: alternate_allele + method: column + encoding: G + - annotation: variant_class + method: column + encoding: H + - annotation: af_popmax + method: column + encoding: Q + - annotation: af_qgp + method: column + encoding: R + - annotation: clinvar_significance + method: column + encoding: AE + - annotation: acmg_classification + method: column + encoding: AF + - annotation: miscellaneous_notes + method: value + encoding: + "Pathogenic/Likely Pathogenic (P/LP) variants in Mendelian genes from + 6,045 Qatari whole genomes. OMIM IDs are semicolon-separated phenotype identifiers. + Population: Qatari (Middle Eastern) biobank cohort." diff --git a/tests/fixtures/realworld/positive/tableconfigs/ALAM1.yaml b/tests/fixtures/realworld/positive/tableconfigs/ALAM1.yaml new file mode 100644 index 0000000..131d01a --- /dev/null +++ b/tests/fixtures/realworld/positive/tableconfigs/ALAM1.yaml @@ -0,0 +1,68 @@ +template: + source: + kind: excel + local: payload.placeholder + url: + - https://pmc.ncbi.nlm.nih.gov/articles/instance/11708054/bin/mbio.01679-24-s0006.xlsx + row_slice: + - 2 + - auto + sheet: all correlations + statement: + subject: + method: column + encoding: A + taxon: 10090 + prioritize: + - OrganismTaxon + avoid: + - Gene + remove: + - "^NA$" + regex: + - pattern: ".*g__" + replacement: "" + - pattern: ";s__NA$" + replacement: "" + - pattern: ";s__sp[0-9]+(-[A-Za-z0-9]+)+$" + replacement: "" + - pattern: ";s__([A-Za-z][A-Za-z0-9]*)(-[A-Za-z0-9]+)+$" + replacement: "" + - pattern: ";s__([A-Za-z][A-Za-z0-9]*)$" + replacement: " ${1}" + predicate: correlated_with + object: + method: value + encoding: CHEBI:41774 + qualifiers: + - qualifier: anatomical_context_qualifier + method: value + encoding: UBERON:0001153 + - qualifier: object_context_qualifier + method: value + encoding: circulating blood 13C-tamoxifen AUC + provenance: + repo: PMC + publication: PMC11708054 + annotations: + - annotation: sample size + method: value + encoding: 9 + - annotation: p value + method: column + encoding: C + - annotation: multiple testing correction method + method: value + encoding: Benjamini Hochberg + - annotation: relationship strength + method: column + encoding: B + - annotation: assertion method + method: value + encoding: Spearman correlation + - annotation: miscellaneous notes + method: value + encoding: Correlation analysis between microbial composition and 13C-tamoxifen abundance after FDR correction + - annotation: FDR result + method: value + encoding: not significant diff --git a/tests/fixtures/realworld/positive/tableconfigs/BRUNDAGE5.yaml b/tests/fixtures/realworld/positive/tableconfigs/BRUNDAGE5.yaml new file mode 100644 index 0000000..cd4cda2 --- /dev/null +++ b/tests/fixtures/realworld/positive/tableconfigs/BRUNDAGE5.yaml @@ -0,0 +1,71 @@ +template: + source: + kind: excel + local: payload.placeholder + url: + - https://pmc-oa-opendata.s3.amazonaws.com/PMC11326326.1/media-5.xlsx + row_slice: + - 1 + - auto + provenance: + repo: PMC + publication: PMC11326326 +sections: + - source: + sheet: BDT6-PRS_Disease_Associations + statement: + subject: + method: column + encoding: A + prioritize: + - Disease + predicate: related_to + object: + method: column + encoding: B + prioritize: + - EnvironmentalExposure + annotations: + - annotation: N + method: column + encoding: C + - annotation: N_Event + method: column + encoding: D + - annotation: Coef + method: column + encoding: E + - annotation: SE + method: column + encoding: F + - annotation: HR + method: column + encoding: G + - annotation: P + method: column + encoding: H + - annotation: P FDR + method: column + encoding: I + - source: + sheet: BDT7-DiseaseDefinitions + statement: + subject: + method: column + encoding: A + prioritize: + - Disease + predicate: related_to + object: + method: value + encoding: ICD definition + annotations: + - annotation: include + method: column + encoding: B + - annotation: code_type + method: column + encoding: C + - annotation: code + method: column + encoding: D diff --git a/tests/fixtures/realworld/positive/tableconfigs/SILVARODRGUEZ3.yaml b/tests/fixtures/realworld/positive/tableconfigs/SILVARODRGUEZ3.yaml new file mode 100644 index 0000000..3e1403a --- /dev/null +++ b/tests/fixtures/realworld/positive/tableconfigs/SILVARODRGUEZ3.yaml @@ -0,0 +1,33 @@ +template: + source: + kind: text + local: payload.placeholder + url: + - https://pmc.ncbi.nlm.nih.gov/articles/PMC11865420/ + delimiter: "," + reindex: + - column: C + comparison: eq + comparator: Y + statement: + subject: + method: column + encoding: A + prioritize: + - Case + predicate: treated_by + object: + method: value + encoding: CHEBI:50381 + prioritize: + - SmallMolecule + provenance: + repo: PMC + publication: PMC11865420 + annotations: + - annotation: miscellaneous notes + method: value + encoding: + "Miglustat-treated patients only (miglustat=Y). 12 of 22 patients received + miglustat treatment. Source: Supplementary Table 3 clinical assessment and NPC1 + gene variants." diff --git a/tests/test_production_patterns.py b/tests/test_production_patterns.py new file mode 100644 index 0000000..5503de6 --- /dev/null +++ b/tests/test_production_patterns.py @@ -0,0 +1,633 @@ +"""Pipeline/e2e tests shaped after named production configs. + +Each test here mirrors a config feature that a real production table config uses but +that the rest of the suite previously exercised only at the model/op level (unit tests +of ``fill``/``explode``/``reindex``/``retrieval_sources`` etc.). The configs that +shaped each test are named in its docstring: + +* MultiomicsNext mokg-v12 (ELDJARN1, HUANG2, DENG8) -- explode+prefix subject + encoding, qualifier-level regex direction mapping, ``${1}`` regex backrefs. +* TableConfigs MBKG (ALAM1, HOSKINSON3, MANOR2, RAVIK9) -- regex chains, default + ``ne`` reindex, ``copysign`` transformations, partial node templates. +* TableConfigs FLAKASSIST (HU1, LIU1, BRUNDAGE2) -- ``fill: forward``/``zero``, + ``suffix``. +* DAKP (contraindications, approved_treats) -- nullable+prioritize+avoid qualifiers, + provenance ``override`` with per-upstream source-record-URL rehoming. + +All tests are offline and deterministic: each builds a tiny REAL fullmap redb inline +via ``rs.build_fullmap_db`` and runs the real six-stage ``build_pipeline`` against +``tmp_path`` payloads, exactly like ``tests/test_e2e_smoke.py``. + +Note on CURIE literals: the fullmap indexes each synonym row's own CURIE as a +resolvable term, so ``method: value`` nodes spelled as CURIEs (e.g. ``MONDO:0004979``) +resolve as long as the redb carries a synonym row for that CURIE -- which +``_build_rich_redb`` provides for every literal used below. +""" + +from __future__ import annotations + +import json +from pathlib import Path +from typing import Any, cast + +import pytest + +from tablassert import rs +from tablassert.cli import build_pipeline +from tablassert.ingests import from_yaml, to_sections, to_yaml +from tablassert.progress import PipelineProgress + + +def _write_jsonl(path: Path, rows: list[dict[str, Any]]) -> Path: + path.write_text("\n".join(json.dumps(row) for row in rows) + "\n") + return path + + +def _synonym_row(curie: str, preferred_name: str, names: list[str], category: str) -> dict[str, Any]: + return {"curie": curie, "preferred_name": preferred_name, "names": names, "types": [category], "taxa": ["NCBITaxon:9606"]} + + +def _class_row(curie: str, equivalents: list[str]) -> dict[str, Any]: + return {"id": curie, "equivalent_identifiers": [{"identifier": x} for x in equivalents]} + + +def _build_rich_redb(root: Path) -> Path: + """Build a tiny REAL fullmap redb covering every term the tests below resolve. + + Beyond plain Gene synonyms this carries: + + * UniProtKB-shaped Protein entries (for the ELDJARN1 explode+prefix test -- the + prefixed products ``UniProtKB:P12345``/``UniProtKB:Q99999`` must resolve). + * A category-ambiguous term ``ambiterm`` on BOTH a Disease CURIE (MONDO:9999, + preferred name exactly ``ambiterm`` so its ``pr_base`` rank is 1) and a + PhenotypicFeature CURIE (HP:9999, preferred name differs, ``pr_base`` 10), so + ``avoid``/``prioritize`` tiebreaks are deterministic: default ranking picks the + Disease, ``prioritize: [PhenotypicFeature]`` flips to HP:9999, and + ``avoid: [PhenotypicFeature]`` leaves only the Disease. + * Synonym rows for the CURIE literals used as ``method: value`` nodes + (``MONDO:0004979``) and for the suffix product ``asthma_incident``. + """ + root.mkdir(parents=True, exist_ok=True) + classes: Path = _write_jsonl( + root / "classes.ndjson", + [ + _class_row("HGNC:1100", ["NCBIGene:672"]), + _class_row("HGNC:6871", ["NCBIGene:5594"]), + _class_row("HGNC:11998", ["NCBIGene:7157"]), + _class_row("HGNC:3236", ["NCBIGene:1956"]), + _class_row("UniProtKB:P12345", []), + _class_row("UniProtKB:Q99999", []), + _class_row("MONDO:0004979", []), + _class_row("MONDO:9999", []), + _class_row("MONDO:5550", []), + _class_row("HP:9999", []), + _class_row("HP:0001250", []), + _class_row("CHEBI:15365", []), + _class_row("CHEBI:3672", []), + ], + ) + synonyms: Path = _write_jsonl( + root / "synonyms.ndjson", + [ + _synonym_row("HGNC:1100", "BRCA1", ["BRCA1", "brca1"], "Gene"), + _synonym_row("HGNC:6871", "MAPK1", ["MAPK1", "mapk1"], "Gene"), + _synonym_row("HGNC:11998", "TP53", ["TP53", "tp53"], "Gene"), + _synonym_row("HGNC:3236", "EGFR", ["EGFR", "egfr"], "Gene"), + _synonym_row("UniProtKB:P12345", "P12345", ["P12345"], "Protein"), + _synonym_row("UniProtKB:Q99999", "Q99999", ["Q99999"], "Protein"), + _synonym_row("MONDO:0004979", "asthma", ["asthma"], "Disease"), + _synonym_row("MONDO:9999", "ambiterm", ["ambiterm"], "Disease"), + _synonym_row("MONDO:5550", "asthma, incident", ["asthma_incident"], "Disease"), + _synonym_row("HP:9999", "Ambiterm phenotype", ["ambiterm"], "PhenotypicFeature"), + _synonym_row("HP:0001250", "seizure", ["seizure"], "PhenotypicFeature"), + _synonym_row("CHEBI:15365", "aspirin", ["aspirin"], "SmallMolecule"), + _synonym_row("CHEBI:3672", "ibuprofen", ["ibuprofen"], "SmallMolecule"), + ], + ) + output: Path = root / "data" / "fullmap.redb" + rs.build_fullmap_db(output, [classes], [synonyms], threads=2) + return output + + +def _table_config(data: Path, statement: dict[str, Any], **extra: Any) -> dict[str, Any]: + """Minimal one-template table config over a headerless TSV payload.""" + template: dict[str, Any] = { + "source": {"kind": "text", "local": str(data), "url": ["https://example.com/data.tsv"], "delimiter": "\t"}, + "statement": statement, + "provenance": {"repo": "PMC", "publication": "PMC0000000"}, + } + template.update(extra) + return {"template": template} + + +def _run_build( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any, table_config: dict[str, Any], fullmap: Path, name: str +) -> tuple[str, str]: + """Write table+graph configs under ``tmp_path`` and run the real six-stage build. + + Returns: + ``(nodes_text, edges_text)`` of the emitted ``_1.0.0.*.ndjson`` files. + """ + monkeypatch.chdir(tmp_path) + (tmp_path / ".tablassert" / "store").mkdir(parents=True, exist_ok=True) + + table: Path = tmp_path / f"{name.lower()}_table.yaml" + to_yaml(table, table_config) + graph: Path = tmp_path / f"{name.lower()}_graph.yaml" + graph_config: dict[str, Any] = { + "name": name, + "version": "1.0.0", + "tables": [str(table)], + "fullmap": str(fullmap), + "rig": rig_factory( + tmp_path, infores_id=f"infores:{name.lower().replace('_', '-')}", source_info={"description": f"{name} production-pattern graph"} + ), + } + to_yaml(graph, graph_config) + + build_pipeline(graph, PipelineProgress(total_stages=6)) + + nodes: Path = tmp_path / f"{name}_1.0.0.nodes.ndjson" + edges: Path = tmp_path / f"{name}_1.0.0.edges.ndjson" + assert nodes.is_file() + assert edges.is_file() + return nodes.read_text(), edges.read_text() + + +def _parse_edges(edge_text: str) -> list[dict[str, Any]]: + return [json.loads(line) for line in edge_text.splitlines() if line.strip()] + + +def test_enum_ranged_qualifier_literal_survives_unresolved(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """An enum-ranged qualifier literal passes through verbatim, never near the fullmap. + + Shaped after the mokg-v12 ``object_direction_qualifier`` literals. The qualifier + range is a closed Biolink vocabulary, so ``_node_ops`` routes it to the + encode-only branch (lib.py): the emitted edge must carry the exact token + ``increased`` -- resolving it would produce ``UMLS:C0205217``, which the slot + rejects. + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("brca1\tmapk1\n") + + config: dict[str, Any] = _table_config( + data, + { + "subject": {"method": "column", "encoding": "A"}, + "predicate": "associated_with", + "object": {"method": "value", "encoding": "MONDO:0004979"}, + "qualifiers": [{"qualifier": "object_direction_qualifier", "method": "value", "encoding": "increased"}], + }, + ) + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "ENUMLIT_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + assert len(edges) == 1 + # Verbatim literal: NOT resolved to a CURIE. + assert edges[0]["object_direction_qualifier"] == "increased" + assert ":" not in edges[0]["object_direction_qualifier"] + + +def test_explode_runs_before_prefix(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """``explode_by`` splits the cell BEFORE ``prefix`` is applied, per exploded token. + + Shaped after MultiomicsNext mokg-v12 ELDJARN1 (``explode_by: _`` + + ``prefix: 'UniProtKB:'`` + ``prioritize`` + ``taxon``). The op order in + ``node_prep``/``encoding`` is fill -> explode -> regex -> remove -> prefix; if + prefix ran first the single row would carry ``UniProtKB:P12345_Q99999`` and fail + resolution instead of producing one row per UniProtKB CURIE. + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("P12345_Q99999\n") + + config: dict[str, Any] = _table_config( + data, + { + "subject": { + "method": "column", + "encoding": "A", + "explode_by": "_", + "prefix": "UniProtKB:", + "prioritize": ["Protein", "Gene"], + "taxon": 9606, + }, + "predicate": "associated_with", + "object": {"method": "value", "encoding": "MONDO:0004979"}, + }, + ) + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "EXPLODE_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + subjects: set[str] = {e["subject"] for e in edges} + # Prefix applied per exploded token: both CURIEs resolve through the real redb. + assert subjects == {"UniProtKB:P12345", "UniProtKB:Q99999"} + # The wrong-order artifact (prefix over the un-split cell) never appears. + assert "UniProtKB:P12345_Q99999" not in edge_text + + +def test_provenance_override_rehomes_urls_in_kgx(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """``provenance.override`` replaces KL/AT and re-homes record URLs onto upstreams. + + Shaped after DAKP approved_treats: two upstream infores (``infores:dailymed``, + ``infores:faers``), a per-upstream ``upstream_source_record_urls`` mapping, + ``knowledge_level: knowledge_assertion`` and + ``agent_type: manual_validation_of_automated_agent``. The primary ``sources`` + entry (the graph RIG infores) lists the upstreams but emits NO + ``source_record_urls``; each supporting entry carries its own URLs instead. + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("brca1\tasthma\n") + + config: dict[str, Any] = _table_config( + data, + {"subject": {"method": "column", "encoding": "A"}, "predicate": "treats", "object": {"method": "column", "encoding": "B"}}, + provenance={ + "repo": "PMC", + "override": { + "upstream_resource_ids": ["infores:dailymed", "infores:faers"], + "upstream_source_record_urls": { + "infores:dailymed": ["https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm"], + "infores:faers": ["https://fis.fda.gov/extensions/FPD-QDE-FAERS/FPD-QDE-FAERS.html"], + }, + "knowledge_level": "knowledge_assertion", + "agent_type": "manual_validation_of_automated_agent", + }, + }, + ) + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "OVERRIDE_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + assert len(edges) == 1 + edge: dict[str, Any] = edges[0] + + # Overridden KL/AT land flat on the edge. + assert edge["knowledge_level"] == "knowledge_assertion" + assert edge["agent_type"] == "manual_validation_of_automated_agent" + + sources: list[dict[str, Any]] = edge["sources"] + by_id: dict[str, dict[str, Any]] = {s["resource_id"]: s for s in sources} + + primary: dict[str, Any] = by_id["infores:override-kg"] + assert primary["resource_role"] == "primary_knowledge_source" + assert primary["upstream_resource_ids"] == ["infores:dailymed", "infores:faers"] + # Rehomed: the primary entry emits no record URLs (the null-stripper omits the key). + assert "source_record_urls" not in primary + + dailymed: dict[str, Any] = by_id["infores:dailymed"] + assert dailymed["resource_role"] == "supporting_data_source" + assert dailymed["source_record_urls"] == ["https://dailymed.nlm.nih.gov/dailymed/spl-resources-all-drug-labels.cfm"] + assert "upstream_resource_ids" not in dailymed + + faers: dict[str, Any] = by_id["infores:faers"] + assert faers["resource_role"] == "supporting_data_source" + assert faers["source_record_urls"] == ["https://fis.fda.gov/extensions/FPD-QDE-FAERS/FPD-QDE-FAERS.html"] + assert "upstream_resource_ids" not in faers + + # The section's own source.url serves the RIG only: it is NOT on any edge entry. + assert "https://example.com/data.tsv" not in edge_text + + +@pytest.mark.parametrize( + ("comparison", "comparator", "driver_values", "expected_subjects"), + [ + # eq/ne compare RAW strings (cast=False in _source_ops), so the driver column + # must stay string-inferred: an "NA" sentinel keeps polars from typing it f64. + pytest.param(None, "NA", ["NA", "ok1", "ok2", "ok3"], {"HGNC:6871", "HGNC:11998", "HGNC:3236"}, id="default-ne"), + pytest.param("ne", "NA", ["NA", "ok1", "ok2", "ok3"], {"HGNC:6871", "HGNC:11998", "HGNC:3236"}, id="ne"), + pytest.param("eq", "NA", ["NA", "ok1", "ok2", "ok3"], {"HGNC:1100"}, id="eq"), + # The numeric operators cast the driver column to Float64 before comparing. + pytest.param("lt", 2, ["0.5", "1.5", "2.5", "3.5"], {"HGNC:1100", "HGNC:6871"}, id="lt"), + pytest.param("le", 1.5, ["0.5", "1.5", "2.5", "3.5"], {"HGNC:1100", "HGNC:6871"}, id="le"), + pytest.param("gt", 2, ["0.5", "1.5", "2.5", "3.5"], {"HGNC:11998", "HGNC:3236"}, id="gt"), + pytest.param("ge", 2.5, ["0.5", "1.5", "2.5", "3.5"], {"HGNC:11998", "HGNC:3236"}, id="ge"), + ], +) +def test_reindex_filters_rows_all_comparisons( + comparison: str | None, + comparator: str | float, + driver_values: list[str], + expected_subjects: set[str], + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, + rig_factory: Any, +) -> None: + """``source.reindex`` filters rows at runtime for every comparison operator. + + The ``default-ne`` case omits ``comparison`` entirely, exactly like TableConfigs + MBKG HOSKINSON3: ``Reindex.comparison`` defaults to ``ne``. ``eq``/``ne`` compare + raw strings (``cast=False`` in the ``_source_ops`` call); the numeric operators + cast the driver column to Float64 first. + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + # Column A = subject term, column B = driver value that decides row survival. + rows: list[str] = [f"{subject}\t{driver}" for subject, driver in zip(["brca1", "mapk1", "tp53", "egfr"], driver_values, strict=True)] + data.write_text("\n".join(rows) + "\n") + + reindex: dict[str, Any] = {"column": "B", "comparator": comparator} + if comparison is not None: + reindex["comparison"] = comparison + config: dict[str, Any] = _table_config( + data, + { + "subject": {"method": "column", "encoding": "A"}, + "predicate": "associated_with", + "object": {"method": "value", "encoding": "MONDO:0004979"}, + }, + ) + config["template"]["source"]["reindex"] = [reindex] + + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "REINDEX_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + assert {e["subject"] for e in edges} == expected_subjects + + +def test_regex_backref_replacement(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """``${1}`` capture-group backrefs and qualifier regex mapping survive the pipeline. + + Subject side is shaped after TableConfigs MBKG ALAM1 / mokg-v12 DENG8: an ordered + regex chain ending in a ``${1}`` backref strips a wrapper prefix and a trailing + comment, leaving the bare gene symbol that resolves. The qualifier side is shaped + after mokg-v12 HUANG2: ``subject_direction_qualifier`` maps ``+`` -> upregulated + and ``-`` -> downregulated on the encode-only (no-resolution) branch. The object + is a PhenotypicFeature so the derived edge class + (``GeneToPhenotypicFeatureAssociation``) actually declares the direction qualifier + slot -- on a plain ``Association`` ``prune_to_class`` would null it. + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("prefix:brca1#row1\t+\nprefix:mapk1#row2\t-\n") + + config: dict[str, Any] = _table_config( + data, + { + "subject": { + "method": "column", + "encoding": "A", + "regex": [{"pattern": "^prefix:", "replacement": ""}, {"pattern": "^(.*)#.*$", "replacement": "${1}"}], + }, + "predicate": "associated_with", + "object": {"method": "value", "encoding": "HP:0001250"}, + "qualifiers": [ + { + "qualifier": "subject_direction_qualifier", + "method": "column", + "encoding": "B", + "regex": [{"pattern": "\\+", "replacement": "upregulated"}, {"pattern": "-", "replacement": "downregulated"}], + } + ], + }, + ) + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "BACKREF_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + by_subject: dict[str, dict[str, Any]] = {e["subject"]: e for e in edges} + # The ${1} backref extracted the bare symbol, which then resolved. + assert set(by_subject) == {"HGNC:1100", "HGNC:6871"} + # The HUANG2 direction mapping landed verbatim (and not as raw +/-). + assert by_subject["HGNC:1100"]["subject_direction_qualifier"] == "upregulated" + assert by_subject["HGNC:6871"]["subject_direction_qualifier"] == "downregulated" + + +def test_avoid_and_prioritize_decide_ambiguous_resolution(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """``avoid``/``prioritize`` deterministically steer a category-ambiguous term. + + ``ambiterm`` sits on BOTH MONDO:9999 (Disease, preferred name matches the term, + so it wins the default ranking) and HP:9999 (PhenotypicFeature). Shaped after the + ELDJARN1/RAVIK9/contraindications ``prioritize``/``avoid`` usage: with + ``avoid: [PhenotypicFeature]`` the edge carries the Disease CURIE; with + ``prioritize: [PhenotypicFeature]`` the same cell flips to the phenotype CURIE + (``filter_and_rank``: priority multiplier 1 beats the default 50). + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("brca1\tambiterm\n") + + def _config(object_overrides: dict[str, Any]) -> dict[str, Any]: + return _table_config( + data, + { + "subject": {"method": "column", "encoding": "A"}, + "predicate": "associated_with", + "object": {"method": "column", "encoding": "B", **object_overrides}, + }, + ) + + _n1, avoid_text = _run_build(tmp_path, monkeypatch, rig_factory, _config({"avoid": ["PhenotypicFeature"]}), fullmap, "AVOID_KG") + _n2, prio_text = _run_build(tmp_path, monkeypatch, rig_factory, _config({"prioritize": ["PhenotypicFeature"]}), fullmap, "PRIORITIZE_KG") + + avoid_edges: list[dict[str, Any]] = _parse_edges(avoid_text) + assert len(avoid_edges) == 1 + assert avoid_edges[0]["object"] == "MONDO:9999" + + prio_edges: list[dict[str, Any]] = _parse_edges(prio_text) + assert len(prio_edges) == 1 + assert prio_edges[0]["object"] == "HP:9999" + + +def test_fill_forward_and_zero_in_pipeline(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """``fill: forward`` on a node and ``fill: zero`` on an annotation fill blank cells. + + Shaped after FLAKASSIST HU1 (gene symbols forward-filled across mask rows) and + LIU1 (``fill: zero`` on statistical annotation columns). Row 2 has a blank subject + and a blank p-value: forward fill carries ``brca1`` down so the row still resolves + to HGNC:1100, and the p-value becomes 0 -> ``0.0000e-02``-style formatted output. + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("brca1\tmapk1\t0.01\n\ttp53\t\n") + + config: dict[str, Any] = _table_config( + data, + { + "subject": {"method": "column", "encoding": "A", "fill": "forward", "prioritize": ["Gene"]}, + "predicate": "associated_with", + "object": {"method": "column", "encoding": "B"}, + }, + annotations=[{"annotation": "p value", "method": "column", "encoding": "C", "fill": "zero"}], + ) + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "FILL_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + assert len(edges) == 2 + by_object: dict[str, dict[str, Any]] = {e["object"]: e for e in edges} + # The blank subject cell was forward-filled with brca1 and resolved to HGNC:1100. + assert by_object["HGNC:11998"]["subject"] == "HGNC:1100" + # fill: zero turned the blank p-value cell into 0, emitted in scientific notation. + assert by_object["HGNC:11998"]["p_value"] == "0.0000e+00" + assert by_object["HGNC:6871"]["p_value"] == "1.0000e-02" + + +def test_copysign_transformation_in_pipeline(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """A ``copysign`` transformation flips the sign of a numeric annotation column. + + Shaped after TableConfigs MBKG MANOR2 (``transformations: [{function: copysign, + arguments: [values, -1]}]`` on the ``relationship strength`` column, which the + clean phase coerces to ``effect_size``). The math op runs on the raw column before + the coercion rename, and the flipped value lands on the edge as ``effect_size``. + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("brca1\tmapk1\t0.85\n") + + config: dict[str, Any] = _table_config( + data, + {"subject": {"method": "column", "encoding": "A"}, "predicate": "correlated_with", "object": {"method": "column", "encoding": "B"}}, + annotations=[ + { + "annotation": "relationship strength", + "method": "column", + "encoding": "C", + "transformations": [{"function": "copysign", "arguments": ["values", -1]}], + }, + {"annotation": "effect type", "method": "value", "encoding": "Spearman"}, + ], + ) + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "COPYSIGN_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + assert len(edges) == 1 + # copysign(0.85, -1) == -0.85, emitted in the controlled {:.4g} decimal notation. + assert edges[0]["effect_size"] == "-0.85" + assert edges[0]["effect_type"] == "spearmans_rho" + + +def test_suffix_in_pipeline(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """``suffix`` appends to the encoded value before resolution. + + Shaped after FLAKASSIST BRUNDAGE2 (``suffix: _incident`` on the object encoding): + the raw cell ``asthma`` becomes ``asthma_incident``, which resolves to the + incident-form MONDO:5550 -- proving the suffix ran pre-resolution (the bare term + would have resolved to MONDO:0004979). + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("brca1\tasthma\n") + + config: dict[str, Any] = _table_config( + data, + { + "subject": {"method": "column", "encoding": "A"}, + "predicate": "associated_with", + "object": {"method": "column", "encoding": "B", "suffix": "_incident", "prioritize": ["Disease"]}, + }, + ) + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "SUFFIX_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + assert len(edges) == 1 + assert edges[0]["object"] == "MONDO:5550" + + +def test_nullable_qualifier_with_prioritize_and_avoid(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """A ``nullable`` qualifier with prioritize/avoid keeps blank rows, resolves the rest. + + Shaped after DAKP contraindications (``disease_context_qualifier`` with + ``nullable: true`` + ``prioritize: [Disease]`` + a long ``avoid`` list). Row 1's + qualifier cell holds the category-ambiguous ``ambiterm`` -- avoid/prioritize steer + it to the Disease CURIE; row 2's cell is blank, so its edge survives with the + qualifier key omitted. The subjects are SmallMolecules (contraindications is a + drug->disease table) so the derived edge class declares the + ``disease_context_qualifier`` slot -- a plain ``biolink:Association`` does not, and + ``prune_to_class`` would reroute the value onto the inlined study instead. + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("aspirin\tasthma\tambiterm\nibuprofen\tasthma\t\n") + + config: dict[str, Any] = _table_config( + data, + { + "subject": {"method": "column", "encoding": "A"}, + "predicate": "associated_with", + "object": {"method": "column", "encoding": "B"}, + "qualifiers": [ + { + "qualifier": "disease_context_qualifier", + "method": "column", + "encoding": "C", + "nullable": True, + "prioritize": ["Disease"], + "avoid": ["PhenotypicFeature"], + } + ], + }, + ) + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "NULLQUAL_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + assert len(edges) == 2 + by_subject: dict[str, dict[str, Any]] = {e["subject"]: e for e in edges} + # Resolved row: avoid/prioritize picked the Disease CURIE for the ambiguous term. + assert by_subject["CHEBI:15365"]["disease_context_qualifier"] == "MONDO:9999" + # Blank row: edge kept, qualifier key omitted entirely. + assert "disease_context_qualifier" not in by_subject["CHEBI:3672"] + + +def test_partial_node_template_merge(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """A template node carrying ONLY ``prioritize`` deep-merges with the section's encoding. + + Shaped after TableConfigs MBKG RAVIK9, whose template declares + ``object: {prioritize: [...]}`` with no ``method``/``encoding`` -- invalid alone, + but ``to_sections`` deep-merges it over each section's + ``object: {method: column, encoding: B}`` so the merged node has all three keys. + Asserts the merge through the real ``to_sections`` expansion, then proves a full + build over the merged config succeeds and honors the template's prioritize. + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("brca1\tambiterm\n") + + config: dict[str, Any] = { + "template": { + "source": {"kind": "text", "local": str(data), "url": ["https://example.com/data.tsv"], "delimiter": "\t"}, + "statement": {"subject": {"method": "column", "encoding": "A"}, "predicate": "associated_with", "object": {"prioritize": ["Disease"]}}, + "provenance": {"repo": "PMC", "publication": "PMC0000000"}, + }, + "sections": [{"statement": {"object": {"method": "column", "encoding": "B"}}}], + } + + table: Path = tmp_path / "merge_table.yaml" + to_yaml(table, config) + sections: list[dict[str, Any]] = to_sections(cast(dict[str, Any], from_yaml(table)), table) # pyright: ignore + merged_object: dict[str, Any] = sections[0]["statement"]["object"] + assert merged_object["prioritize"] == ["Disease"] + assert merged_object["method"] == "column" + assert merged_object["encoding"] == "B" + + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "MERGE_KG") + edges: list[dict[str, Any]] = _parse_edges(edge_text) + assert len(edges) == 1 + # The template's prioritize steered the ambiguous term to the Disease CURIE. + assert edges[0]["object"] == "MONDO:9999" + + +def test_row_slice_crops_specific_rows(tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rig_factory: Any) -> None: + """``row_slice: [2, auto]`` crops the leading rows before any encoding runs. + + The bound is a zero-based offset (``crop`` slices the frame from index 2), so on a + four-row payload the first two rows are dropped and only rows 3-4 produce edges. + Every production config above uses this shape to skip header rows + (``row_slice: [1, auto]`` in the docs tutorial skips a one-line header). + """ + fullmap: Path = _build_rich_redb(tmp_path / "fullmap") + data: Path = tmp_path / "data.tsv" + data.write_text("brca1\tasthma\nmapk1\tasthma\ntp53\tasthma\negfr\tasthma\n") + + config: dict[str, Any] = _table_config( + data, {"subject": {"method": "column", "encoding": "A"}, "predicate": "associated_with", "object": {"method": "column", "encoding": "B"}} + ) + config["template"]["source"]["row_slice"] = [2, "auto"] + + _nodes, edge_text = _run_build(tmp_path, monkeypatch, rig_factory, config, fullmap, "SLICE_KG") + + edges: list[dict[str, Any]] = _parse_edges(edge_text) + subjects: set[str] = {e["subject"] for e in edges} + # Rows 1-2 (brca1, mapk1) are cropped away; rows 3-4 (tp53, egfr) survive. + assert subjects == {"HGNC:11998", "HGNC:3236"} + assert "HGNC:1100" not in edge_text + assert "HGNC:6871" not in edge_text diff --git a/tests/test_realworld_configs.py b/tests/test_realworld_configs.py new file mode 100644 index 0000000..8474ae3 --- /dev/null +++ b/tests/test_realworld_configs.py @@ -0,0 +1,252 @@ +"""Validate real-world production configurations vendored under ``tests/fixtures/realworld``. + +The positive corpus mirrors configs from the MultiomicsNext, DAKP, and TableConfigs +repositories (provenance in ``tests/fixtures/realworld/README.md``) with every ``local:`` +payload path rewritten to ``payload.placeholder`` — validation never reads payloads, so the +configs validate offline. The negative corpus holds deliberate legacy configs that 12.x must +reject. + +An env-gated sweep runs the same validation over the live corpora on this machine: set +``TABLASSERT_CONFIG_CORPUS`` to a JSON array of directory paths, e.g. +``TABLASSERT_CONFIG_CORPUS='["/path/to/mokg-v12", "/path/to/DAKP/tables"]'``. +""" + +from __future__ import annotations + +import json +import os +from pathlib import Path +from typing import Any + +import pydantic +import pytest + +from tablassert.errors import UnpairedEffectAnnotationWarning +from tablassert.ingests import from_yaml, to_sections +from tablassert.lib import Tcode +from tablassert.models import Graph + +ROOT: Path = Path(__file__).resolve().parent.parent +REALWORLD: Path = ROOT / "tests" / "fixtures" / "realworld" +POSITIVE: Path = REALWORLD / "positive" +NEGATIVE: Path = REALWORLD / "negative" +STORE: Path = ROOT / ".tablassert" / "store" / "realworld.parquet" + +ENV_CONFIG_CORPUS: str = "TABLASSERT_CONFIG_CORPUS" + +# Known-legacy production configs the sweep EXPECTS to fail, mapped to a substring the +# failure must contain. MIN1.yaml declares `anatomical_context_qualifier` both on the +# template and on individual sections, and `to_sections` list-merges them into duplicates; +# its cleaned 12.x conversion (MultiomicsNext mokg-v12/MIN1.v12.yaml) removed the +# template-level qualifier, so this is the pre-cleanup original, not a validation bug. +# Entries that unexpectedly PASS also fail the sweep, keeping this list honest. +KNOWN_CORPUS_FAILURES: dict[str, str] = {"/home/skyeav/Code/ISB/TableConfigs/TABLE/MOKG/MIN1.yaml": "is declared more than once in `qualifiers`"} + +# Legacy keys each negative fixture must be rejected over; the assertion checks the +# ValidationError text names them so a rejection for the WRONG reason still fails. +NEGATIVE_EXPECTED_KEYS: dict[str, list[str]] = {"DRUGIBD.yaml": ["syntax", "status", "contributors"], "MOKG.yaml": ["rig", "description"]} + + +def _positive_yaml_files() -> list[Path]: + """Return every vendored positive configuration. + + Returns: + Sorted list of positive YAML paths. + """ + return sorted(POSITIVE.rglob("*.yaml")) + + +def _negative_yaml_files() -> list[Path]: + """Return every vendored negative (known-legacy) configuration. + + Returns: + Sorted list of negative YAML paths. + """ + return sorted(NEGATIVE.glob("*.yaml")) + + +def _validate_config(path: Path) -> None: + """Validate one configuration the same way ``tablassert validate`` does. + + Graph configurations (top-level ``tables:`` key) go through ``Graph``; table + configurations are expanded via ``to_sections`` and each section is validated + through ``Tcode``. + + Args: + path: Configuration YAML to validate. + """ + raw: Any = from_yaml(path) + assert isinstance(raw, dict), f"{path.name} did not parse to a mapping" + + if "tables" in raw: + # Graph configuration. + Graph.model_validate(raw) + return + + sections: list[dict[str, Any]] = to_sections(raw, path) # pyright: ignore + assert sections, f"{path.name} produced no sections" + for section in sections: + Tcode.model_validate({**section, "store": STORE}) + + +def _validated_tcode(path: Path) -> Tcode: + """Expand and validate the (single) section of a vendored table configuration. + + Args: + path: Table configuration YAML. + + Returns: + The validated ``Tcode`` for the first expanded section. + """ + raw: Any = from_yaml(path) + section: dict[str, Any] = to_sections(raw, path)[0] # pyright: ignore + return Tcode.model_validate({**section, "store": STORE}) + + +def test_positive_corpus_nonempty() -> None: + """The vendored positive corpus is present.""" + assert _positive_yaml_files(), f"no positive YAML files found under {POSITIVE}" + + +@pytest.mark.parametrize("path", _positive_yaml_files(), ids=lambda p: p.name) +def test_positive_corpus_validates(path: Path) -> None: + """Each vendored real-world configuration validates against the live schema. + + Args: + path: Configuration YAML to validate. + """ + _validate_config(path) + + +@pytest.mark.parametrize("path", _negative_yaml_files(), ids=lambda p: p.name) +def test_negative_corpus_rejected(path: Path) -> None: + """Each vendored legacy configuration is rejected, naming its retired keys. + + Args: + path: Legacy configuration YAML expected to fail validation. + """ + expected_keys: list[str] = NEGATIVE_EXPECTED_KEYS[path.name] + with pytest.raises(pydantic.ValidationError) as excinfo: + _validate_config(path) + message: str = str(excinfo.value) + for key in expected_keys: + assert key in message, f"{path.name} rejection did not mention retired key {key!r}:\n{message}" + + +def test_dakp_approved_treats_semantics() -> None: + """DAKP approved-treats keeps its ``split_by`` annotations and provenance override.""" + tcode: Tcode = _validated_tcode(POSITIVE / "dakp" / "approved_treats.yaml") + split_by: dict[str, Any] = {str(a.annotation): a.split_by for a in tcode.annotations or []} + assert split_by["approval_ids"] == "|" + assert split_by["has_evidence"] == "|" + + override: Any = tcode.provenance.override + assert override is not None + urls: dict[str, Any] = override.upstream_source_record_urls + assert "infores:dailymed" in urls + assert "infores:faers" in urls + + +def test_dakp_contraindications_nullable_qualifier() -> None: + """DAKP contraindications carries a nullable ``disease_context_qualifier``.""" + tcode: Tcode = _validated_tcode(POSITIVE / "dakp" / "contraindications.yaml") + qualifiers: dict[str, Any] = {str(q.qualifier): q for q in tcode.statement.qualifiers or []} + assert "disease_context_qualifier" in qualifiers + assert qualifiers["disease_context_qualifier"].nullable is True + + +def test_ayoglu1_v12_drops_unpaired_effect_size() -> None: + """The unpaired ``effect_size`` annotation is dropped with a warning, section kept.""" + path: Path = POSITIVE / "mokg-v12" / "AYOGLU1.v12.yaml" + raw: Any = from_yaml(path) + section: dict[str, Any] = to_sections(raw, path)[0] # pyright: ignore + assert any(a["annotation"] == "effect_size" for a in section["annotations"]) + with pytest.warns(UnpairedEffectAnnotationWarning): + tcode: Tcode = Tcode.model_validate({**section, "store": STORE}) + targets: list[str] = [str(a.annotation) for a in tcode.annotations or []] + assert "effect_size" not in targets + assert "p_value" in targets # the rest of the section survives the drop + + +def test_refconfigs_anchors_resolve() -> None: + """YAML anchor/alias provenance expands onto every section of the refconfig.""" + path: Path = POSITIVE / "refconfigs" / "AYOGLU1.yaml" + raw: Any = from_yaml(path) + sections: list[dict[str, Any]] = to_sections(raw, path) # pyright: ignore + assert sections, f"{path.name} produced no sections" + for section in sections: + tcode: Tcode = Tcode.model_validate({**section, "store": STORE}) + assert tcode.provenance.publication == "PMC4119355" + + +def test_multisection_v12_expands_all_sections() -> None: + """The multi-section v12 fixture expands to its full section count.""" + path: Path = POSITIVE / "mokg-v12" / "CORREIA3.v12.yaml" + sections: list[dict[str, Any]] = to_sections(from_yaml(path), path) # pyright: ignore + assert len(sections) == 6 + + +def test_dakp_graph_rig_populated() -> None: + """The DAKP graph configuration validates with a fully populated RIG.""" + graph: Graph = Graph.model_validate(from_yaml(POSITIVE / "dakp" / "graph.yaml")) + assert graph.rig.source_info.infores_id == "infores:multiomics-drugapprovals" + assert graph.rig.ingest_info is not None + assert graph.rig.provenance_info.contributions + + +def _corpus_dirs(spec: str) -> list[Path]: + """Parse ``TABLASSERT_CONFIG_CORPUS`` as a JSON array of directory paths. + + Args: + spec: Raw environment variable value. + + Returns: + The decoded directory paths. + """ + try: + entries: Any = json.loads(spec) + except json.JSONDecodeError as exc: + pytest.fail(f"{ENV_CONFIG_CORPUS} must be a JSON array of directory paths; got invalid JSON {spec!r}: {exc}") + if not isinstance(entries, list): + pytest.fail(f"{ENV_CONFIG_CORPUS} must be a JSON array of directory paths; got non-array JSON {spec!r}") + for entry in entries: + if not isinstance(entry, str) or not entry.strip(): + pytest.fail(f"{ENV_CONFIG_CORPUS} entries must be non-empty path strings; got {entry!r} in {spec!r}") + return [Path(entry) for entry in entries] + + +def test_external_corpus_sweep() -> None: + """REAL corpus sweep, gated on ``TABLASSERT_CONFIG_CORPUS``; skips with a reason when unset. + + ``TABLASSERT_CONFIG_CORPUS`` is a JSON array of directory paths, each recursively + globbed for ``*.yaml`` and validated like the vendored positive corpus. Every failure + is collected and reported in one assertion message, except the known-legacy entries in + ``KNOWN_CORPUS_FAILURES`` (which must fail, and for the recorded reason). Documented + directories on this machine: MultiomicsNext ``.tablassert/mokg-v12``, DAKP ``tables/``, + and TableConfigs ``TABLE/{FLAKASSIST,MBKG,MOKG}`` (QI is excluded as known-legacy). + """ + spec: str | None = os.environ.get(ENV_CONFIG_CORPUS) + if not spec: + reason: str = ( + f"set {ENV_CONFIG_CORPUS} to a JSON array of directory paths — " + f'["", ...] — ' + "to sweep the live corpora (e.g. MultiomicsNext .tablassert/mokg-v12, DAKP tables/, " + "TableConfigs TABLE/{FLAKASSIST,MBKG,MOKG})" + ) + print(reason) + pytest.skip(reason) + + failures: list[str] = [] + for directory in _corpus_dirs(spec): + assert directory.is_dir(), f"{ENV_CONFIG_CORPUS} directory does not exist: {directory}" + for path in sorted(directory.rglob("*.yaml")): + known_reason: str | None = KNOWN_CORPUS_FAILURES.get(str(path)) + try: + _validate_config(path) + except Exception as exc: # collect ALL failures; report them together below + if known_reason is None or known_reason not in str(exc): + failures.append(f"{path}\n{exc}") + else: + if known_reason is not None: + failures.append(f"{path}\nexpected known-legacy failure ({known_reason!r}) but the config validated") + assert not failures, f"{len(failures)} external config(s) failed validation:\n\n" + "\n\n".join(failures)