Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion collection-seeding/sources/covid_pango_lineages.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,13 @@ def get_collections(self) -> list[Collection]:

def _build_collection(self, entry: dict) -> Collection:
lineage: str = entry["lineage"]
parent: str = entry.get("parent") or "—"
raw_parent: str = entry.get("parent") or ""
parent: str = raw_parent or "—"
clade: str = entry.get("nextstrainClade") or "—"
date: str = entry.get("designationDate") or "unknown"

parent_clause = f" ({raw_parent})" if raw_parent else ""

nuc_subs = [s for s in entry.get("nucSubstitutions", []) if s]
aa_subs = [s for s in entry.get("aaSubstitutions", []) if s]
nuc_subs_new = [s for s in entry.get("nucSubstitutionsNew", []) if s]
Expand All @@ -47,21 +50,25 @@ def _build_collection(self, entry: dict) -> Collection:
{
"type": "filterObject",
"name": "Nucleotide substitutions",
"description": "All nucleotide substitutions that define this lineage.",
"filterObject": {"nucleotideMutations": nuc_subs},
},
{
"type": "filterObject",
"name": "Amino acid substitutions",
"description": "All amino acid substitutions that define this lineage.",
"filterObject": {"aminoAcidMutations": aa_subs},
},
{
"type": "filterObject",
"name": "New nucleotide substitutions",
"description": f"Nucleotide substitutions not present in the parent lineage{parent_clause}.",
"filterObject": {"nucleotideMutations": nuc_subs_new},
},
{
"type": "filterObject",
"name": "New amino acid substitutions",
"description": f"Amino acid substitutions not present in the parent lineage{parent_clause}.",
"filterObject": {"aminoAcidMutations": aa_subs_new},
},
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,6 @@ def test_mutations_prefixed_with_na():
assert aa.startswith("NA:"), f"Expected NA: prefix, got {aa!r}"



# --- PA inhibitor (Baloxavir) collections ----------------------------------


Expand Down
37 changes: 37 additions & 0 deletions collection-seeding/tests/test_pango_lineages.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,43 @@ def test_build_collection_always_four_variants():
assert len(col["variants"]) == 4


def test_build_collection_variant_descriptions_with_parent():
col = CovidPangoLineagesSource()._build_collection(SAMPLE_DATA["BA.2"])
variants = col["variants"]
assert (
variants[0]["description"]
== "All nucleotide substitutions that define this lineage."
)
assert (
variants[1]["description"]
== "All amino acid substitutions that define this lineage."
)
assert (
variants[2]["description"]
== "Nucleotide substitutions not present in the parent lineage (BA)."
)
assert (
variants[3]["description"]
== "Amino acid substitutions not present in the parent lineage (BA)."
)


def test_build_collection_variant_descriptions_unknown_parent():
col = CovidPangoLineagesSource()._build_collection(SAMPLE_DATA["XBB"])
variants = col["variants"]
# No parent clause (and no dangling "(—)") when the parent is unknown
assert (
variants[2]["description"]
== "Nucleotide substitutions not present in the parent lineage."
)
assert (
variants[3]["description"]
== "Amino acid substitutions not present in the parent lineage."
)
assert "—" not in variants[2]["description"]
assert "—" not in variants[3]["description"]


def test_build_collection_variant_names():
col = CovidPangoLineagesSource()._build_collection(SAMPLE_DATA["BA.2"])
names = [v["name"] for v in col["variants"]]
Expand Down
3 changes: 3 additions & 0 deletions website/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ export default defineConfig({
trace: 'retain-on-failure',
screenshot: 'only-on-failure',
},
expect: {
timeout: 15_000,
},

projects: [
// API integration tests (browser-independent)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
import { type FC, useMemo } from 'react';

import { CollectionsList } from './CollectionsList.tsx';
Expand All @@ -15,9 +16,14 @@ import { usePageState } from '../usePageState.ts';
export type CovidSingleVariantReactPageProps = {
organismsConfig: OrganismsConfig;
isStaging: boolean;
mutationAnnotations?: MutationAnnotations;
};

export const CovidSingleVariantReactPage: FC<CovidSingleVariantReactPageProps> = ({ organismsConfig, isStaging }) => {
export const CovidSingleVariantReactPage: FC<CovidSingleVariantReactPageProps> = ({
organismsConfig,
isStaging,
mutationAnnotations,
}) => {
const organismViewKey: OrganismViewKey = 'covid.singleVariantView';
const view = useMemo(() => new Routing(organismsConfig).getOrganismView(organismViewKey), [organismsConfig]);

Expand Down Expand Up @@ -49,6 +55,7 @@ export const CovidSingleVariantReactPage: FC<CovidSingleVariantReactPageProps> =
view={view}
downloadLinks={downloadLinks}
organismsConfig={organismsConfig}
mutationAnnotations={mutationAnnotations}
filters={
<>
<SingleVariantPageStateSelector
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
import { type FC, useMemo } from 'react';

import { GenericAnalyseSingleVariantDataDisplay } from './GenericAnalyseSingleVariantDataDisplay';
Expand All @@ -16,12 +17,14 @@ export type GenericAnalyseSingleVariantReactPageProps = {
organism: Exclude<OrganismWithViewKey<typeof singleVariantViewKey>, typeof Organisms.covid>;
organismsConfig: OrganismsConfig;
isStaging: boolean;
mutationAnnotations?: MutationAnnotations;
};

export const GenericAnalyseSingleVariantReactPage: FC<GenericAnalyseSingleVariantReactPageProps> = ({
organism,
organismsConfig,
isStaging,
mutationAnnotations,
}) => {
const organismViewKey = `${organism}.${singleVariantViewKey}` satisfies OrganismViewKey;
const view = useMemo(
Expand Down Expand Up @@ -57,6 +60,7 @@ export const GenericAnalyseSingleVariantReactPage: FC<GenericAnalyseSingleVarian
view={view}
downloadLinks={downloadLinks}
organismsConfig={organismsConfig}
mutationAnnotations={mutationAnnotations}
filters={
<SingleVariantPageStateSelector
view={view}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { GenericAnalyseSingleVariantReactPage } from './GenericAnalyseSingleVari
import { isStaging, getDashboardsConfig } from '../../../config';
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
import { Organisms } from '../../../types/Organism';
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
import { type OrganismWithViewKey } from '../../../views/routing';
import { ServerSide } from '../../../views/serverSideRouting';
import { singleVariantViewKey } from '../../../views/viewKeys';
Expand All @@ -14,13 +15,16 @@ interface Props {
const { organism } = Astro.props;

const view = ServerSide.routing.getOrganismView(`${organism}.${singleVariantViewKey}`);

const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
---

<BaseLayout title={view.viewTitle}>
<GenericAnalyseSingleVariantReactPage
organism={organism}
organismsConfig={getDashboardsConfig().dashboards.organisms}
isStaging={isStaging()}
mutationAnnotations={mutationAnnotations}
client:only='react'
/>
</BaseLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { GenericCompareSideBySideReactPage } from './GenericCompareSideBySideReactPage';
import { isStaging, getDashboardsConfig } from '../../../config';
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
import { type OrganismWithViewKey } from '../../../views/routing';
import { ServerSide } from '../../../views/serverSideRouting';
import { compareSideBySideViewKey } from '../../../views/viewKeys';
Expand All @@ -15,6 +16,8 @@ const { organism, hideMutationComponents } = Astro.props;

const view = ServerSide.routing.getOrganismView(`${organism}.${compareSideBySideViewKey}`);
const organismsConfig = getDashboardsConfig().dashboards.organisms;

const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
---

<BaseLayout title={view.viewTitle}>
Expand All @@ -23,6 +26,7 @@ const organismsConfig = getDashboardsConfig().dashboards.organisms;
hideMutationComponents={hideMutationComponents}
organismsConfig={organismsConfig}
isStaging={isStaging()}
mutationAnnotations={mutationAnnotations}
client:only='react'
/>
</BaseLayout>
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
import { type FC, useMemo, useState, useEffect } from 'react';

import { GenericCompareSideBySideDataDisplay } from './GenericCompareSideBySideDataDisplay.tsx';
Expand All @@ -15,13 +16,15 @@ export type GenericCompareSideBySideReactPageProps = {
hideMutationComponents?: boolean;
organismsConfig: OrganismsConfig;
isStaging: boolean;
mutationAnnotations?: MutationAnnotations;
};

export const GenericCompareSideBySideReactPage: FC<GenericCompareSideBySideReactPageProps> = ({
organism,
hideMutationComponents,
organismsConfig,
isStaging,
mutationAnnotations,
}) => {
const organismViewKey = `${organism}.${compareSideBySideViewKey}` satisfies OrganismViewKey;

Expand All @@ -45,6 +48,7 @@ export const GenericCompareSideBySideReactPage: FC<GenericCompareSideBySideReact
lapisUrl={organismsConfig[organism].lapis.url}
view={view}
downloadLinks={downloadLinks}
mutationAnnotations={mutationAnnotations}
>
<div className='flex'>
<div className='flex flex-1 flex-col'>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { GenericCompareToBaselineReactPage } from './GenericCompareToBaselineReactPage';
import { isStaging, getDashboardsConfig } from '../../../config';
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
import { type OrganismWithViewKey } from '../../../views/routing';
import { ServerSide } from '../../../views/serverSideRouting';
import { compareToBaselineViewKey } from '../../../views/viewKeys';
Expand All @@ -13,13 +14,16 @@ interface Props {
const { organism } = Astro.props;

const view = ServerSide.routing.getOrganismView(`${organism}.${compareToBaselineViewKey}`);

const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
---

<BaseLayout title={view.viewTitle}>
<GenericCompareToBaselineReactPage
organism={organism}
organismsConfig={getDashboardsConfig().dashboards.organisms}
isStaging={isStaging()}
mutationAnnotations={mutationAnnotations}
client:only='react'
/>
</BaseLayout>
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
import { type FC, useMemo } from 'react';

import { GenericCompareToBaselineDataDisplay } from './GenericCompareToBaselineDataDisplay';
Expand All @@ -13,12 +14,14 @@ export type GenericCompareToBaselineReactPageProps = {
organism: OrganismWithViewKey<typeof compareToBaselineViewKey>;
organismsConfig: OrganismsConfig;
isStaging: boolean;
mutationAnnotations?: MutationAnnotations;
};

export const GenericCompareToBaselineReactPage: FC<GenericCompareToBaselineReactPageProps> = ({
organism,
organismsConfig,
isStaging,
mutationAnnotations,
}) => {
const organismViewKey = `${organism}.${compareToBaselineViewKey}` satisfies OrganismViewKey;
const view = useMemo(
Expand All @@ -44,6 +47,7 @@ export const GenericCompareToBaselineReactPage: FC<GenericCompareToBaselineReact
view={view}
downloadLinks={downloadLinks}
organismsConfig={organismsConfig}
mutationAnnotations={mutationAnnotations}
filters={
<CompareVariantsToBaselineStateSelector
view={view}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { GenericCompareVariantsReactPage } from './GenericCompareVariantsReactPage';
import { isStaging, getDashboardsConfig } from '../../../config';
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
import { type OrganismWithViewKey } from '../../../views/routing';
import { ServerSide } from '../../../views/serverSideRouting';
import { compareVariantsViewKey } from '../../../views/viewKeys';
Expand All @@ -13,13 +14,16 @@ interface Props {
const { organism } = Astro.props;

const view = ServerSide.routing.getOrganismView(`${organism}.${compareVariantsViewKey}`);

const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
---

<BaseLayout title={view.viewTitle}>
<GenericCompareVariantsReactPage
organism={organism}
organismsConfig={getDashboardsConfig().dashboards.organisms}
isStaging={isStaging()}
mutationAnnotations={mutationAnnotations}
client:only='react'
/>
</BaseLayout>
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
import { type FC, useMemo } from 'react';

import { GenericCompareVariantsDataDisplay } from './GenericCompareVariantsDataDisplay';
Expand All @@ -13,12 +14,14 @@ export type GenericCompareVariantsReactPageProps = {
organism: OrganismWithViewKey<typeof compareVariantsViewKey>;
organismsConfig: OrganismsConfig;
isStaging: boolean;
mutationAnnotations?: MutationAnnotations;
};

export const GenericCompareVariantsReactPage: FC<GenericCompareVariantsReactPageProps> = ({
organism,
organismsConfig,
isStaging,
mutationAnnotations,
}) => {
const organismViewKey = `${organism}.${compareVariantsViewKey}` satisfies OrganismViewKey;
const view = useMemo(
Expand All @@ -44,6 +47,7 @@ export const GenericCompareVariantsReactPage: FC<GenericCompareVariantsReactPage
view={view}
downloadLinks={downloadLinks}
organismsConfig={organismsConfig}
mutationAnnotations={mutationAnnotations}
filters={
<CompareVariantsPageStateSelector
view={view}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { GenericSequencingEffortsReactPage } from './GenericSequencingEffortsReactPage';
import { isStaging, getDashboardsConfig } from '../../../config';
import BaseLayout from '../../../layouts/base/BaseLayout.astro';
import { fetchOrganismMutationAnnotations } from '../../../util/fetchOrganismMutationAnnotations';
import { type OrganismWithViewKey } from '../../../views/routing';
import { ServerSide } from '../../../views/serverSideRouting';
import { sequencingEffortsViewKey } from '../../../views/viewKeys';
Expand All @@ -13,13 +14,16 @@ interface Props {
const { organism } = Astro.props;

const view = ServerSide.routing.getOrganismView(`${organism}.${sequencingEffortsViewKey}`);

const mutationAnnotations = await fetchOrganismMutationAnnotations(view.organismConstants, organism);
---

<BaseLayout title={view.viewTitle}>
<GenericSequencingEffortsReactPage
organism={organism}
organismsConfig={getDashboardsConfig().dashboards.organisms}
isStaging={isStaging()}
mutationAnnotations={mutationAnnotations}
client:only='react'
/>
</BaseLayout>
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { MutationAnnotations } from '@genspectrum/dashboard-components/util';
import { type FC, useMemo } from 'react';

import { GenericSequencingEffortsDataDisplay } from './GenericSequencingEffortsDataDisplay';
Expand All @@ -12,12 +13,14 @@ export type GenericSequencingEffortsReactPageProps = {
organism: OrganismWithViewKey<typeof sequencingEffortsViewKey>;
organismsConfig: OrganismsConfig;
isStaging: boolean;
mutationAnnotations?: MutationAnnotations;
};

export const GenericSequencingEffortsReactPage: FC<GenericSequencingEffortsReactPageProps> = ({
organism,
organismsConfig,
isStaging,
mutationAnnotations,
}) => {
const organismViewKey = `${organism}.${sequencingEffortsViewKey}` satisfies OrganismViewKey;
const view = useMemo(
Expand All @@ -42,6 +45,7 @@ export const GenericSequencingEffortsReactPage: FC<GenericSequencingEffortsReact
view={view}
downloadLinks={downloadLinks}
organismsConfig={organismsConfig}
mutationAnnotations={mutationAnnotations}
filters={
<SequencingEffortsPageStateSelector
view={view}
Expand Down
Loading
Loading