diff --git a/.gitignore b/.gitignore index 7b116d59f..023f0cdc6 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ dist/ .cache coverage/ .vscode/ +.phpunit.result.cache # local deployment files /deploy.sh @@ -74,5 +75,11 @@ local_dev/tools/**/*.csv local_dev/tools/**/*.json local_dev/tools/**/*.log +# Playwright +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ + # mac os .DS_Store diff --git a/docker-compose.yml b/docker-compose.yml index 16336b40d..95ba37a8e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -247,6 +247,8 @@ services: PYTHONIOENCODING: "utf-8" R_ALTMETRIC_APIKEY: "${R_ALTMETRIC_APIKEY}" R_CROSSREF_APIMAIL: "${R_CROSSREF_APIMAIL}" + R_CROSSREF_PLUS_TOKEN: "${R_CROSSREF_PLUS_TOKEN}" + R_CROSSREF_BATCH_SIZE: "${R_CROSSREF_BATCH_SIZE}" restart: unless-stopped volumes: - ./local_dev/renv/cache:/renv/cache diff --git a/e2e/basicTests/AQUANAVI.spec.ts b/e2e/basicTests/AQUANAVI.spec.ts new file mode 100644 index 000000000..8bd12b42e --- /dev/null +++ b/e2e/basicTests/AQUANAVI.spec.ts @@ -0,0 +1,27 @@ +import { test, expect } from "@playwright/test"; +import { prepareVisualisation } from "../../vis/js/utils/e2eVisualisationLoader"; + +test.describe("Basic tests for AQUANAVI integration (Geomap visualisation type)", () => { + test.describe("Using direct dynamic URL / PSVS link", () => { + test("Loads default Geomap visualisation", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=geomap&q=mesocosms&service=aquanavi&custom_title=aquatic+mesocosm+facilities&min_descsize=0"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await expect(page.locator("#search-term-unique")).toContainText( + "aquatic mesocosm facilities", + ); + await expect(page.locator("#source")).toContainText( + "Data source: AQUANAVI", + ); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This geo map presents you with an overview of aquatic mesocosm facilities.", + ); + await expect(page.locator("#info-body")).toContainText( + "This visualization has a custom title and was created using the following query: mesocosms", + ); + }); + }); +}); diff --git a/e2e/basicTests/ORCID.spec.ts b/e2e/basicTests/ORCID.spec.ts new file mode 100644 index 000000000..745ad9609 --- /dev/null +++ b/e2e/basicTests/ORCID.spec.ts @@ -0,0 +1,50 @@ +import { test, expect } from "@playwright/test"; +import { prepareVisualisation } from "../../vis/js/utils/e2eVisualisationLoader"; +import { waitForVisualisationCreation } from "../../vis/js/utils/e2eWaitForVisualisationCreation"; + +test.describe("Basic tests for ORCID integration (Knowledge Map visualisation type)", () => { + test.describe("Using direct dynamic URL / PSVS link", () => { + test("Loads default Knowledge Map visualisation", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&orcid=0000-0001-6011-4382&service=orcid&embed=true"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await expect(page.locator("#search-term-unique")).toContainText( + "Sebastian Dennerlein (0000-0001-6011-4382)", + ); + + await page.getByText("About the map").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of the most recent works of Sebastian Dennerlein (0000-0001-6011-4382).", + ); + }); + }); + + test.describe("Using search embedded search box", () => { + test("Loads default Knowledge Map visualisation", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/embedded_searchbox?service=orcid&embed=true"; + + await page.goto(VISUALISATION_DYNAMIC_URL); + await page + .getByRole("textbox", { name: "Enter ORCID (e.g. 0000-0002-" }) + .click(); + await page + .getByRole("textbox", { name: "Enter ORCID (e.g. 0000-0002-" }) + .fill("0000-0001-6011-4382"); + await page.getByRole("button", { name: "Create Overview" }).click(); + + await waitForVisualisationCreation(page); + + await expect(page.locator("#search-term-unique")).toContainText( + "Sebastian Dennerlein (0000-0001-6011-4382)", + ); + + await page.getByText("About the map").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of the most recent works of Sebastian Dennerlein (0000-0001-6011-4382).", + ); + }); + }); +}); diff --git a/e2e/basicTests/OpenAIRE.spec.ts b/e2e/basicTests/OpenAIRE.spec.ts new file mode 100644 index 000000000..60eac7f59 --- /dev/null +++ b/e2e/basicTests/OpenAIRE.spec.ts @@ -0,0 +1,24 @@ +import { test, expect } from "@playwright/test"; +import { prepareVisualisation } from "../../vis/js/utils/e2eVisualisationLoader"; + +test.describe("Basic tests for OpenAIRE integration (Knowledge Map visualisation type)", () => { + test.describe("Using direct dynamic URL / PSVS link", () => { + test("Loads default Knowledge Map visualisation", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=&q=&service=openaire&project_id=710722&funder=EC"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await expect(page.locator(".truncated-project-title")).toContainText( + "OpenUP - OPENing UP new methods, indicators", + ); + await expect(page.locator("#source")).toContainText( + "Data source: OpenAIRE", + ); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research conducted in the following project:Project DetailsTitleOPENing UP new methods, indicators and tools for peer review, impact measurement and dissemination of research resultsAcronymOpenUPFunderECFunding programCSAH2020CallH2020-GARRI-2015-1Contract (GA) number710722Start Date2016-06-01End Date2018-11-30Open Access mandatetrueOrganizationsUGOE, UvA, PUBLIC POLICY AND MANAGEMENT INSTITUTE, FRONTIERS MEDIA SA, UoA, DZHW, AIT, Know Center, CNROpenAire LinkLinkWe use text similarity to create a knowledge map. The algorithm groups those resources together that have many words in common. Area titles are created from subject keywords of resources that have been assigned to the same area. We select those keywords and phrases that appear frequently in one area, and seldom in other areas.Knowledge maps provide an instant overview of a topic by showing the main areas at a glance, and resources related to them. This makes it possible to easily identify useful, pertinent information.Please read our FAQs to find out more about knowledge maps.Data sourceThe data is taken from OpenAIRE. OpenAIRE is a key infrastructure that enables the European transition to open science. It provides access to 3 million research projects and more than 70 million research outputs from more than 100,000 data sources.Open source softwareThe visualization is created with the award winning open source software Head Start provided by Open Knowledge Maps. Open Knowledge Maps is a non-profit organisation run by a group of dedicated team members and volunteers. In order to improve our free and open service, we need your support. Please send us your feedback to info@openknowledgemaps.org.If you want to support us financially, you can:Make a donationBecome an organisational memberBecome a funder of our roadmapSign-up for our newsletter to receive occasional updates.", + ); + }); + }); +}); diff --git a/e2e/basicTests/PubMed.spec.ts b/e2e/basicTests/PubMed.spec.ts new file mode 100644 index 000000000..64000bb00 --- /dev/null +++ b/e2e/basicTests/PubMed.spec.ts @@ -0,0 +1,112 @@ +import { test, expect } from "@playwright/test"; +import { prepareVisualisation } from "../../vis/js/utils/e2eVisualisationLoader"; +import { waitForVisualisationCreation } from "../../vis/js/utils/e2eWaitForVisualisationCreation"; + +test.describe("Basic tests for PubMed integration (Knowledge Map visualisation type)", () => { + test.describe("Using direct dynamic URL / PSVS link", () => { + test("Loads default Knowledge Map visualisation", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=infection&service=pubmed&sorting=most-relevant"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await expect(page.locator("#search-term-unique")).toContainText( + "infection", + ); + await expect(page.locator("#source")).toContainText( + "Data source: PubMed", + ); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on infection based on the 100 most relevant resources matching your search query.", + ); + }); + }); + + test.describe("Using search embedded search box", () => { + test("Loads default Knowledge Map visualisation", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = "/embedded_searchbox?service=pubmed"; + + await page.goto(VISUALISATION_DYNAMIC_URL); + await page + .getByRole("textbox", { name: "Enter search query (e.g." }) + .click(); + await page + .getByRole("textbox", { name: "Enter search query (e.g." }) + .fill("infection"); + await page.getByRole("button", { name: "Create Overview" }).click(); + await waitForVisualisationCreation(page); + + await expect(page.locator("#search-term-unique")).toContainText( + "infection", + ); + await expect(page.locator("#source")).toContainText( + "Data source: PubMed", + ); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on infection based on the 100 most relevant resources matching your search query.", + ); + }); + }); + + test.describe("Using old search box", () => { + const MAIN_PAGE = ""; + + test("Loads default Knowledge Map visualisation using the 'covid-19' try out link", async ({ + page, + }) => { + await page.goto(MAIN_PAGE); + + await page.getByRole("radio", { name: "PubMed (life sciences)" }).check(); + + const visualisationPagePromise = page.waitForEvent("popup"); + await page.getByRole("link", { name: "covid-" }).click(); + const visualisationPage = await visualisationPagePromise; + + await waitForVisualisationCreation(visualisationPage); + + await expect( + visualisationPage.locator("#search-term-unique"), + ).toContainText("covid-19"); + await expect(visualisationPage.locator("#source")).toContainText( + "Data source: PubMed", + ); + await visualisationPage + .getByTestId("context") + .getByText("More information") + .click(); + await expect(visualisationPage.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on covid-19 based on the 100 most relevant resources matching your search query.We use text similarity to create a knowledge map. The algorithm groups those resources together that have many words in common. Area titles are created from subject keywords of resources that have been assigned to the same area. We select those keywords and phrases that appear frequently in one area, and seldom in other areas.Knowledge maps provide an instant overview of a topic by showing the main areas at a glance, and resources related to them. This makes it possible to easily identify useful, pertinent information.Please read our FAQs to find out more about knowledge maps.Data sourceThe data is taken from PubMed. PubMed comprises more than 38 million citations for biomedical literature from MEDLINE, life science journals, and online books. For more information please visit the PubMed website.Citations are available for resources with a DOI and based on citation data provided by Crossref. Results may be impacted by accuracy and completeness of this data.Open source softwareThe visualization is created with the award winning open source software Head Start provided by Open Knowledge Maps. Open Knowledge Maps is a non-profit organisation run by a group of dedicated team members and volunteers. In order to improve our free and open service, we need your support. Please send us your feedback to info@openknowledgemaps.org.If you want to support us financially, you can:Make a donationBecome an organisational memberBecome a funder of our roadmapSign-up for our newsletter to receive occasional updates.", + ); + }); + + test('Loads default Knowledge Map visualisation using the "climate change" try out link', async ({ + page, + }) => { + await page.goto(MAIN_PAGE); + + await page.getByRole("radio", { name: "PubMed (life sciences)" }).check(); + + const visualisationPagePromise = page.waitForEvent("popup"); + await page.getByRole("link", { name: '"climate change"' }).click(); + const visualisationPage = await visualisationPagePromise; + + await waitForVisualisationCreation(visualisationPage); + + await expect( + visualisationPage.locator("#search-term-unique"), + ).toContainText('"climate change"'); + await expect(visualisationPage.locator("#source")).toContainText( + "Data source: PubMed", + ); + await visualisationPage + .getByTestId("context") + .getByText("More information") + .click(); + await expect(visualisationPage.locator("#info-body")).toContainText( + 'This knowledge map presents you with a topical overview of research on "climate change" based on the 100 most relevant resources matching your search query.', + ); + }); + }); +}); diff --git a/e2e/basicTests/base.spec.ts b/e2e/basicTests/base.spec.ts new file mode 100644 index 000000000..0347ba559 --- /dev/null +++ b/e2e/basicTests/base.spec.ts @@ -0,0 +1,147 @@ +import { test, expect } from "@playwright/test"; +import { prepareVisualisation } from "../../vis/js/utils/e2eVisualisationLoader"; +import { waitForVisualisationCreation } from "../../vis/js/utils/e2eWaitForVisualisationCreation"; + +test.describe("Basic tests for BASE integration (Knowledge Map and Streamgraph visualisation types)", () => { + test.describe("Using direct dynamic URL / PSVS link", () => { + test("Loads default Knowledge Map visualisation", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=digital%20education&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await expect(page.locator("#search-term-unique")).toContainText( + "digital education", + ); + await expect(page.locator("#source")).toContainText("Data source: BASE"); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on digital education based on the 100 most relevant resources matching your search query.", + ); + }); + + test("Loads default Streamgraph visualisation", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=timeline&q=climate%20change&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await expect(page.locator("#search-term-unique")).toContainText( + "climate change", + ); + await expect(page.locator("#source")).toContainText("Data source: BASE"); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This streamgraph presents you with an overview of the main keywords related to climate change over time. It is based on the most relevant resources related to the main keywords. Up to 1000 resources have been taken into consideration for the computation of the streamgraph.The height of a stream represents the number of resources with this keyword at a specific time. It is important to note that the number of resources matches the relative height, not the absolute height of the stream.Streamgraphs are particularly useful for investigating the evolution of keywords over time and to analyse trends in research.Please read our FAQs to find out more about streamgraphs.Data sourceThe data is taken from BASE. BASE provides access to over 400 million resources from more than 10,000 content sources in all disciplines. For more information please visit the BASE website.Open source softwareThe visualization is created with the award winning open source software Head Start provided by Open Knowledge Maps. Open Knowledge Maps is a non-profit organisation run by a group of dedicated team members and volunteers. In order to improve our free and open service, we need your support. Please send us your feedback to info@openknowledgemaps.org.If you want to support us financially, you can:Make a donationBecome an organisational memberBecome a funder of our roadmapSign-up for our newsletter to receive occasional updates.", + ); + }); + }); + + test.describe("Using search embedded search box", () => { + const SEARCH_BOX_URL = "/embedded_searchbox"; + + test("Loads default Knowledge Map visualisation", async ({ page }) => { + await page.goto(SEARCH_BOX_URL); + await page + .getByRole("textbox", { name: "Enter search query (e.g." }) + .click(); + await page + .getByRole("textbox", { name: "Enter search query (e.g." }) + .fill("digital education"); + await page.getByRole("button", { name: "Create Overview" }).click(); + await waitForVisualisationCreation(page); + + await expect(page.locator("#search-term-unique")).toContainText( + "digital education", + ); + await expect(page.locator("#source")).toContainText("Data source: BASE"); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on digital education based on the 100 most relevant resources matching your search query.", + ); + }); + + test("Loads default Streamgraph visualisation", async ({ page }) => { + await page.goto(SEARCH_BOX_URL + "?service=base&show_vis_type=true"); + + await page.getByText("Show advanced search options").click(); + await page + .getByRole("radio", { name: 'Option "Streamgraph" for "' }) + .check(); + await page + .getByRole("textbox", { name: "Enter search query (e.g." }) + .click(); + await page + .getByRole("textbox", { name: "Enter search query (e.g." }) + .fill("climate change"); + await page.getByRole("button", { name: "Create Overview" }).click(); + await waitForVisualisationCreation(page); + await expect(page.locator("#search-term-unique")).toContainText( + "climate change", + ); + await expect(page.locator("#source")).toContainText("Data source: BASE"); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This streamgraph presents you with an overview of the main keywords related to climate change over time. It is based on the most relevant resources related to the main keywords. Up to 1000 resources have been taken into consideration for the computation of the streamgraph.The height of a stream represents the number of resources with this keyword at a specific time. It is important to note that the number of resources matches the relative height, not the absolute height of the stream.Streamgraphs are particularly useful for investigating the evolution of keywords over time and to analyse trends in research.Please read our FAQs to find out more about streamgraphs.Data sourceThe data is taken from BASE. BASE provides access to over 400 million resources from more than 10,000 content sources in all disciplines. For more information please visit the BASE website.Open source softwareThe visualization is created with the award winning open source software Head Start provided by Open Knowledge Maps. Open Knowledge Maps is a non-profit organisation run by a group of dedicated team members and volunteers. In order to improve our free and open service, we need your support. Please send us your feedback to info@openknowledgemaps.org.If you want to support us financially, you can:Make a donationBecome an organisational memberBecome a funder of our roadmapSign-up for our newsletter to receive occasional updates.", + ); + }); + }); + + test.describe("Using old search box", () => { + const MAIN_PAGE = ""; + + test("Loads default Knowledge Map visualisation using the 'digital education' try out link", async ({ + page, + }) => { + await page.goto(MAIN_PAGE); + + const visualisationPagePromise = page.waitForEvent("popup"); + await page.getByRole("link", { name: "digital education" }).click(); + const visualisationPage = await visualisationPagePromise; + + await waitForVisualisationCreation(visualisationPage); + + await expect( + visualisationPage.locator("#search-term-unique"), + ).toContainText("digital education"); + await expect(visualisationPage.locator("#source")).toContainText( + "Data source: BASE", + ); + await visualisationPage + .getByTestId("context") + .getByText("More information") + .click(); + await expect(visualisationPage.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on digital education based on the 100 most relevant resources matching your search query.", + ); + }); + + test("Loads default Knowledge Map visualisation using the 'climate change AND impact' try out link", async ({ + page, + }) => { + await page.goto(MAIN_PAGE); + + const visualisationPagePromise = page.waitForEvent("popup"); + await page + .getByRole("link", { name: "climate change AND impact" }) + .click(); + const visualisationPage = await visualisationPagePromise; + + await waitForVisualisationCreation(visualisationPage); + + await expect( + visualisationPage.locator("#search-term-unique"), + ).toContainText("climate change and impact"); + await expect(visualisationPage.locator("#source")).toContainText( + "Data source: BASE", + ); + await visualisationPage + .getByTestId("context") + .getByText("More information") + .click(); + await expect(visualisationPage.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on climate change and impact based on the 100 most relevant resources matching your search query.", + ); + }); + }); +}); diff --git a/e2e/benchmark/crossref-timing.spec.ts b/e2e/benchmark/crossref-timing.spec.ts new file mode 100644 index 000000000..f45f2a357 --- /dev/null +++ b/e2e/benchmark/crossref-timing.spec.ts @@ -0,0 +1,175 @@ +import { test, expect, Page } from "@playwright/test"; +import * as fs from "fs"; +import * as path from "path"; + +const MASTER_URL = process.env.BENCHMARK_MASTER_URL ?? "https://dev.openknowledgemaps.org/master"; +const FEATURE_URL = process.env.BENCHMARK_FEATURE_URL ?? "https://dev.openknowledgemaps.org/crossref-rate-limit-enhancement"; + +const SEARCHES = [ + // ORCID — reuse IDs from existing e2e tests + { + name: "ORCID: Sebastian Dennerlein (0000-0001-6011-4382)", + path: "/search?type=get&vis_type=overview&orcid=0000-0001-6011-4382&service=orcid&embed=true&academic_age_offset=1", + }, + { + name: "ORCID: Christian Hilbe (0000-0001-5116-955X)", + path: "/search?type=get&vis_type=overview&orcid=0000-0001-5116-955X&service=orcid&embed=true&academic_age_offset=1", + }, + { + name: "ORCID: 0000-0003-0204-881X", + path: "/search?type=get&vis_type=overview&orcid=0000-0003-0204-881X&service=orcid&embed=true&academic_age_offset=1", + }, + { + name: "ORCID: 0000-0003-2897-6075", + path: "/search?type=get&vis_type=overview&orcid=0000-0003-2897-6075&service=orcid&embed=true&academic_age_offset=1", + }, + { + name: "ORCID: 0000-0002-8911-7832", + path: "/search?type=get&vis_type=overview&orcid=0000-0002-8911-7832&service=orcid&embed=true&academic_age_offset=1", + }, + { + name: "ORCID: 0000-0002-9843-6798", + path: "/search?type=get&vis_type=overview&orcid=0000-0002-9843-6798&service=orcid&embed=true&academic_age_offset=1", + }, + { + name: "ORCID: 0000-0003-4221-6275", + path: "/search?type=get&vis_type=overview&orcid=0000-0003-4221-6275&service=orcid&embed=true&academic_age_offset=1", + }, + { + name: "ORCID: 0000-0002-2233-6926", + path: "/search?type=get&vis_type=overview&orcid=0000-0002-2233-6926&service=orcid&embed=true&academic_age_offset=1", + }, + { + name: "ORCID: 0000-0002-2441-4043", + path: "/search?type=get&vis_type=overview&orcid=0000-0002-2441-4043&service=orcid&embed=true&academic_age_offset=1", + }, + { + name: "ORCID: 0000-0001-9287-3770", + path: "/search?type=get&vis_type=overview&orcid=0000-0001-9287-3770&service=orcid&embed=true&academic_age_offset=1", + }, + + // PubMed — general biomedical domains + { + name: "PubMed: machine learning diagnosis", + path: "/search?type=get&vis_type=overview&q=machine%20learning%20diagnosis&service=pubmed&sorting=most-relevant", + }, + { + name: "PubMed: CRISPR gene editing", + path: "/search?type=get&vis_type=overview&q=CRISPR%20gene%20editing&service=pubmed&sorting=most-relevant", + }, + { + name: "PubMed: gut microbiome disease", + path: "/search?type=get&vis_type=overview&q=gut%20microbiome%20disease&service=pubmed&sorting=most-relevant", + }, + { + name: "PubMed: COVID-19 long-term effects", + path: "/search?type=get&vis_type=overview&q=COVID-19%20long-term%20effects&service=pubmed&sorting=most-relevant", + }, + { + name: "PubMed: Alzheimer neurodegeneration", + path: "/search?type=get&vis_type=overview&q=Alzheimer%20neurodegeneration&service=pubmed&sorting=most-relevant", + }, + { + name: "PubMed: immunotherapy cancer", + path: "/search?type=get&vis_type=overview&q=immunotherapy%20cancer&service=pubmed&sorting=most-relevant", + }, + { + name: "PubMed: antibiotic resistance", + path: "/search?type=get&vis_type=overview&q=antibiotic%20resistance&service=pubmed&sorting=most-relevant", + }, + { + name: "PubMed: cardiovascular risk factors", + path: "/search?type=get&vis_type=overview&q=cardiovascular%20risk%20factors&service=pubmed&sorting=most-relevant", + }, + { + name: "PubMed: mRNA vaccine", + path: "/search?type=get&vis_type=overview&q=mRNA%20vaccine&service=pubmed&sorting=most-relevant", + }, + { + name: "PubMed: diabetes insulin resistance", + path: "/search?type=get&vis_type=overview&q=diabetes%20insulin%20resistance&service=pubmed&sorting=most-relevant", + }, +]; + +async function timeVisualization(page: Page, fullUrl: string): Promise { + const start = Date.now(); + await page.goto(fullUrl); + const context = page.getByTestId("context"); + await expect(context).toBeVisible({ timeout: 5 * 60 * 1000 }); + await expect + .poll( + async () => ((await context.textContent()) ?? "").replace(/\s+/g, " ").trim(), + { timeout: 5 * 60 * 1000, intervals: [500, 1000, 2000, 5000] }, + ) + .not.toBe(""); + return Date.now() - start; +} + +const results: { name: string; masterMs: number; featureMs: number; deltaMs: number }[] = []; + +for (const search of SEARCHES) { + test(search.name, async ({ page }, testInfo) => { + const masterMs = await timeVisualization(page, MASTER_URL + search.path); + const featureMs = await timeVisualization(page, FEATURE_URL + search.path); + const deltaMs = featureMs - masterMs; + + testInfo.annotations.push( + { type: "master_ms", description: String(masterMs) }, + { type: "feature_ms", description: String(featureMs) }, + { type: "delta_ms", description: String(deltaMs) }, + ); + + await testInfo.attach("timing", { + body: JSON.stringify({ name: search.name, masterMs, featureMs, deltaMs }), + contentType: "application/json", + }); + + results.push({ name: search.name, masterMs, featureMs, deltaMs }); + + const faster = deltaMs < 0; + const pct = Math.abs((deltaMs / masterMs) * 100).toFixed(1); + console.log( + `\n ${search.name}\n` + + ` master: ${(masterMs / 1000).toFixed(1)}s\n` + + ` feature: ${(featureMs / 1000).toFixed(1)}s\n` + + ` ${faster ? "▲ faster" : "▼ slower"} by ${Math.abs(deltaMs)}ms (${pct}%)`, + ); + }); +} + +test.afterAll(async ({}, testInfo) => { + if (results.length === 0) return; + + const totalMaster = results.reduce((s, r) => s + r.masterMs, 0); + const totalFeature = results.reduce((s, r) => s + r.featureMs, 0); + const totalDelta = totalFeature - totalMaster; + + const colWidth = Math.max(...results.map((r) => r.name.length)) + 2; + const header = + "Search".padEnd(colWidth) + " master(s) feature(s) delta"; + const separator = "─".repeat(header.length); + const rows = results.map((r) => + r.name.padEnd(colWidth) + + ` ${(r.masterMs / 1000).toFixed(2).padStart(9)}` + + ` ${(r.featureMs / 1000).toFixed(2).padStart(10)}` + + ` ${(r.deltaMs > 0 ? "+" : "") + (r.deltaMs / 1000).toFixed(2).padStart(8)}s`, + ); + const totalsRow = + "TOTAL".padEnd(colWidth) + + ` ${(totalMaster / 1000).toFixed(2).padStart(9)}` + + ` ${(totalFeature / 1000).toFixed(2).padStart(10)}` + + ` ${(totalDelta > 0 ? "+" : "") + (totalDelta / 1000).toFixed(2).padStart(8)}s`; + + const summary = [separator, header, separator, ...rows, separator, totalsRow, separator].join("\n"); + + console.log("\n\nBENCHMARK SUMMARY\n" + summary); + + const outPath = path.resolve("benchmark-results.json"); + fs.writeFileSync(outPath, JSON.stringify({ master: MASTER_URL, feature: FEATURE_URL, results }, null, 2)); + console.log(`\nFull results written to ${outPath}`); + + await testInfo.attach("summary", { + body: summary, + contentType: "text/plain", + }); +}); diff --git a/e2e/example.spec.ts b/e2e/example.spec.ts new file mode 100644 index 000000000..9bb32c2fe --- /dev/null +++ b/e2e/example.spec.ts @@ -0,0 +1,10 @@ +import { test, expect } from "@playwright/test"; + +test.describe("Headstart base example", () => { + test("Loads search box on landing page", async ({ page }) => { + await page.goto("/"); + + const searchForm = page.locator("#searchform"); + await expect(searchForm).toBeVisible(); + }); +}); diff --git a/e2e/keywordsEnrichment/ORCID.spec.ts b/e2e/keywordsEnrichment/ORCID.spec.ts new file mode 100644 index 000000000..e3ad1fa63 --- /dev/null +++ b/e2e/keywordsEnrichment/ORCID.spec.ts @@ -0,0 +1,23 @@ +import { test, expect } from "@playwright/test"; +import { prepareVisualisation } from "../../vis/js/utils/e2eVisualisationLoader"; + +test.describe("Tests to check how keywords enrichment works", () => { + test.skip("Keywords enrichment for the 'Asymmetric Power Boosts Extortion in an Economic Experiment' document (replace strategy)", async ({ + page, + }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&orcid=0000-0001-5116-955X&service=orcid&embed=true"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await expect(page.locator("#search-term-unique")).toContainText( + "Christian Hilbe (0000-0001-5116-955X)", + ); + await page + .getByTitle("Asymmetric Power Boosts Extortion in an Economic Experiment") + .click(); + await expect(page.locator("#list_holder")).toContainText( + "Keywords: Physical Sciences; Mathematics; Applied Mathematics; Game Theory; Social Sciences; Economics; Experimental Economics; Prisoner's Dilemma; Biology and Life Sciences; Behavior; Psychology; Social Psychology; Experimental Design; Mathematical and Statistical Techniques; Statistical Methods; Generalized Linear Model; Statistics (Mathematics); Recreation; Games", + ); + }); +}); diff --git a/e2e/moreInformationModal/AQUANAVI.spec.ts b/e2e/moreInformationModal/AQUANAVI.spec.ts new file mode 100644 index 000000000..c61808e75 --- /dev/null +++ b/e2e/moreInformationModal/AQUANAVI.spec.ts @@ -0,0 +1,101 @@ +import { test, expect } from "@playwright/test"; +import { prepareVisualisation } from "../../vis/js/utils/e2eVisualisationLoader"; + +test.describe("More information modal window in AQUANAVI", () => { + test.describe("Interactivity tests", () => { + test("Opening and closing correctly", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=geomap&q=&service=aquanavi&min_descsize=0&q_advanced=query+advanced"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info_modal")).toBeVisible(); + await page.getByRole("button", { name: "Close Close" }).click(); + await expect(page.locator("#info_modal")).toBeHidden(); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info_modal")).toBeVisible(); + + await page.locator("#info_modal").click({ position: { x: 0, y: 0 } }); + await expect(page.locator("#info_modal")).toBeHidden(); + }); + }); + + test.describe("Different combinations of query, query advanced and custom title", () => { + test("Query, no query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=geomap&q=mesocosms&service=aquanavi&min_descsize=0"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This geo map presents you with an overview of mesocosms.", + ); + }); + + test("Query, query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=geomap&q=mesocosms&service=aquanavi&min_descsize=0&q_advanced=query+advanced"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This geo map presents you with an overview of mesocosms and query advanced.", + ); + }); + + test("Query, query advanced, custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=geomap&q=mesocosms&service=aquanavi&min_descsize=0&q_advanced=query+advanced&custom_title=aquatic+mesocosm+facilities"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This geo map presents you with an overview of aquatic mesocosm facilities.", + ); + await expect(page.locator("#info-body")).toContainText( + "This visualization has a custom title and was created using the following query: mesocosms and query advanced", + ); + }); + + test("No query, no query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=geomap&q=&service=aquanavi&min_descsize=0"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This geo map presents you with an overview of .", + ); + }); + + test("No query, no query advanced, custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=geomap&q=&service=aquanavi&custom_title=aquatic+mesocosm+facilities&min_descsize=0"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This geo map presents you with an overview of aquatic mesocosm facilities.", + ); + }); + + test("No query, query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=geomap&q=&service=aquanavi&min_descsize=0&q_advanced=query+advanced"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This geo map presents you with an overview of query advanced.", + ); + }); + }); +}); diff --git a/e2e/moreInformationModal/BASE.spec.ts b/e2e/moreInformationModal/BASE.spec.ts new file mode 100644 index 000000000..a18a5b7fe --- /dev/null +++ b/e2e/moreInformationModal/BASE.spec.ts @@ -0,0 +1,275 @@ +import { test, expect } from "@playwright/test"; +import { prepareVisualisation } from "../../vis/js/utils/e2eVisualisationLoader"; + +test.describe("More information modal window in BASE", () => { + test.describe("Interactivity tests", () => { + test("Opening and closing correctly (Knowledge Map visualisation type)", async ({ + page, + }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=digital%20education&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info_modal")).toBeVisible(); + await page.getByRole("button", { name: "Close Close" }).click(); + await expect(page.locator("#info_modal")).toBeHidden(); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info_modal")).toBeVisible(); + + await page.locator("#info_modal").click({ position: { x: 0, y: 0 } }); + await expect(page.locator("#info_modal")).toBeHidden(); + }); + + test("Opening and closing correctly (Streamgraph visualisation type)", async ({ + page, + }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=timeline&q=climate%20change&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info_modal")).toBeVisible(); + await page.getByRole("button", { name: "Close Close" }).click(); + await expect(page.locator("#info_modal")).toBeHidden(); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info_modal")).toBeVisible(); + + await page.locator("#info_modal").click({ position: { x: 0, y: 0 } }); + await expect(page.locator("#info_modal")).toBeHidden(); + }); + }); + + test.describe("Different combinations of query, query advanced and custom title", () => { + test.describe("Knowledge Map visualisation", () => { + test("Query, no query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=digital%20education&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&from=1665-01-01&min_descsize=0&exclude_date_filters=true"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on digital education based on the 100 most relevant resources matching your search query.", + ); + }); + + test("Query, query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=digital%20education&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&from=1665-01-01&min_descsize=0&exclude_date_filters=true&q_advanced=query+advanced"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on digital education and query advanced based on the 100 most relevant resources matching your search query.", + ); + }); + + test("Query, query advanced, custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=digital%20education&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&from=1665-01-01&min_descsize=0&exclude_date_filters=true&q_advanced=query+advanced&custom_title=custom+title"; + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on custom title based on the 100 most relevant resources matching your search query.", + ); + await expect(page.locator("#info-body")).toContainText( + "This visualization has a custom title and was created using the following query: digital education and query advanced", + ); + }); + + test("No query, no query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&from=1665-01-01&min_descsize=0&exclude_date_filters=true"; + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research based on 100 resources.", + ); + + await expect(page.locator("#info-body")).toContainText( + "We use text similarity to create a knowledge map. The algorithm groups those resources together that have many words in common. Area titles are created from subject keywords of resources that have been assigned to the same area. We select those keywords and phrases that appear frequently in one area, and seldom in other areas.", + ); + await expect(page.locator("#info-body")).toContainText( + "Knowledge maps provide an instant overview of a topic by showing the main areas at a glance, and resources related to them. This makes it possible to easily identify useful, pertinent information.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about knowledge maps.", + ); + }); + + test("No query, no query advanced, custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&from=1665-01-01&min_descsize=0&exclude_date_filters=true&custom_title=custom+title"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on custom title based on the 100 most relevant resources matching your search query.", + ); + await expect(page.locator("#info-body")).toContainText( + "We use text similarity to create a knowledge map. The algorithm groups those resources together that have many words in common. Area titles are created from subject keywords of resources that have been assigned to the same area. We select those keywords and phrases that appear frequently in one area, and seldom in other areas.", + ); + await expect(page.locator("#info-body")).toContainText( + "Knowledge maps provide an instant overview of a topic by showing the main areas at a glance, and resources related to them. This makes it possible to easily identify useful, pertinent information.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about knowledge maps.", + ); + }); + + test("No query, query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&from=1665-01-01&min_descsize=0&exclude_date_filters=true&q_advanced=query+advanced"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on query advanced based on the 100 most relevant resources matching your search query.", + ); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research based on 100 resources.", + ); + await expect(page.locator("#info-body")).toContainText( + "We use text similarity to create a knowledge map. The algorithm groups those resources together that have many words in common. Area titles are created from subject keywords of resources that have been assigned to the same area. We select those keywords and phrases that appear frequently in one area, and seldom in other areas.", + ); + await expect(page.locator("#info-body")).toContainText( + "Knowledge maps provide an instant overview of a topic by showing the main areas at a glance, and resources related to them. This makes it possible to easily identify useful, pertinent information.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about knowledge maps.", + ); + }); + }); + + test.describe("Streamgraph visualisation", () => { + test("Query, no query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=timeline&q=climate%20change&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300&embed=true"; + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This streamgraph presents you with an overview of the main keywords related to climate change over time. It is based on the most relevant resources related to the main keywords. Up to 1000 resources have been taken into consideration for the computation of the streamgraph.", + ); + await expect(page.locator("#info-body")).toContainText( + "The height of a stream represents the number of resources with this keyword at a specific time. It is important to note that the number of resources matches the relative height, not the absolute height of the stream.", + ); + await expect(page.locator("#info-body")).toContainText( + "Streamgraphs are particularly useful for investigating the evolution of keywords over time and to analyse trends in research.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about streamgraphs.", + ); + }); + + test("Query, query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=timeline&q=climate%20change&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300&embed=true&q_advanced=dcrelation:%22https://zenodo.org/communities/biosyslit%22"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + 'This streamgraph presents you with an overview of the main keywords related to climate change and dcrelation:"https://zenodo.org/communities/biosyslit" over time. It is based on the most relevant resources related to the main keywords. Up to 1000 resources have been taken into consideration for the computation of the streamgraph.', + ); + await expect(page.locator("#info-body")).toContainText( + "The height of a stream represents the number of resources with this keyword at a specific time. It is important to note that the number of resources matches the relative height, not the absolute height of the stream.", + ); + await expect(page.locator("#info-body")).toContainText( + "Streamgraphs are particularly useful for investigating the evolution of keywords over time and to analyse trends in research.", + ); + }); + + test("Query, query advanced, custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=timeline&q=climate%20change&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300&embed=true&q_advanced=query+advanced&custom_title=custom+title"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This streamgraph presents you with an overview of the main keywords related to custom title over time. It is based on the most relevant resources related to the main keywords. Up to 1000 resources have been taken into consideration for the computation of the streamgraph.", + ); + await expect(page.locator("#info-body")).toContainText( + "The height of a stream represents the number of resources with this keyword at a specific time. It is important to note that the number of resources matches the relative height, not the absolute height of the stream.", + ); + await expect(page.locator("#info-body")).toContainText( + "This visualization has a custom title and was created using the following query: climate change", + ); + await expect(page.locator("#info-body")).toContainText( + "Streamgraphs are particularly useful for investigating the evolution of keywords over time and to analyse trends in research.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about streamgraphs.", + ); + }); + + test("No query, no query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=timeline&q=&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300&embed=true"; + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This streamgraph presents you with an overview of the main keywords over time. It is based on the most relevant resources related to the main keywords. Up to 1000 resources have been taken into consideration for the computation of the streamgraph.", + ); + await expect(page.locator("#info-body")).toContainText( + "The height of a stream represents the number of resources with this keyword at a specific time. It is important to note that the number of resources matches the relative height, not the absolute height of the stream.", + ); + await expect(page.locator("#info-body")).toContainText( + "Streamgraphs are particularly useful for investigating the evolution of keywords over time and to analyse trends in research.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about streamgraphs.", + ); + }); + + test("No query, no query advanced, custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=timeline&q=&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300&embed=true&custom_title=custom+title"; + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This streamgraph presents you with an overview of the main keywords related to custom title over time. It is based on the most relevant resources related to the main keywords. Up to 1000 resources have been taken into consideration for the computation of the streamgraph.", + ); + await expect(page.locator("#info-body")).toContainText( + "The height of a stream represents the number of resources with this keyword at a specific time. It is important to note that the number of resources matches the relative height, not the absolute height of the stream.", + ); + await expect(page.locator("#info-body")).toContainText( + "Streamgraphs are particularly useful for investigating the evolution of keywords over time and to analyse trends in research.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about streamgraphs.", + ); + }); + + test("No query, query advanced, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=timeline&q=&service=base&sorting=most-relevant&document_types%5B%5D=121&lang_id%5B%5D=all-lang&min_descsize=300&embed=true&q_advanced=dccoverage:%22Rocky%20Mountains%22"; + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + 'This streamgraph presents you with an overview of the main keywords related to dccoverage:"Rocky Mountains" over time. It is based on the most relevant resources related to the main keywords. Up to 1000 resources have been taken into consideration for the computation of the streamgraph.', + ); + await expect(page.locator("#info-body")).toContainText( + "The height of a stream represents the number of resources with this keyword at a specific time. It is important to note that the number of resources matches the relative height, not the absolute height of the stream.", + ); + await expect(page.locator("#info-body")).toContainText( + "Streamgraphs are particularly useful for investigating the evolution of keywords over time and to analyse trends in research.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about streamgraphs.", + ); + }); + }); + }); +}); diff --git a/e2e/moreInformationModal/PubMed.spec.ts b/e2e/moreInformationModal/PubMed.spec.ts new file mode 100644 index 000000000..63568419b --- /dev/null +++ b/e2e/moreInformationModal/PubMed.spec.ts @@ -0,0 +1,207 @@ +import { test, expect } from "@playwright/test"; +import { prepareVisualisation } from "../../vis/js/utils/e2eVisualisationLoader"; + +test.describe("More information modal window in PubMed", () => { + test.describe("Interactivity tests", () => { + test("Opening and closing correctly", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=geomap&q=&service=aquanavi&min_descsize=0&q_advanced=query+advanced"; + + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info_modal")).toBeVisible(); + await page.getByRole("button", { name: "Close Close" }).click(); + await expect(page.locator("#info_modal")).toBeHidden(); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info_modal")).toBeVisible(); + + await page.locator("#info_modal").click({ position: { x: 0, y: 0 } }); + await expect(page.locator("#info_modal")).toBeHidden(); + }); + }); + + test.describe("Different combinations of query, query advanced and custom title", () => { + test("Query, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=infection&service=pubmed&sorting=most-relevant"; + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on infection based on the 100 most relevant resources matching your search query.", + ); + await expect(page.locator("#info-body")).toContainText( + "We use text similarity to create a knowledge map. The algorithm groups those resources together that have many words in common. Area titles are created from subject keywords of resources that have been assigned to the same area. We select those keywords and phrases that appear frequently in one area, and seldom in other areas.", + ); + await expect(page.locator("#info-body")).toContainText( + "Knowledge maps provide an instant overview of a topic by showing the main areas at a glance, and resources related to them. This makes it possible to easily identify useful, pertinent information.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about knowledge maps.", + ); + await expect(page.locator("#info-body")).toContainText("Data source"); + await expect(page.locator("#info-body")).toContainText( + "The data is taken from PubMed. PubMed comprises more than 38 million citations for biomedical literature from MEDLINE, life science journals, and online books. For more information please visit the PubMed website.Citations are available for resources with a DOI and based on citation data provided by Crossref. Results may be impacted by accuracy and completeness of this data.", + ); + await expect(page.locator("#info-body")).toContainText( + "Open source software", + ); + await expect(page.locator("#info-body")).toContainText( + "The visualization is created with the award winning open source software Head Start provided by Open Knowledge Maps. Open Knowledge Maps is a non-profit organisation run by a group of dedicated team members and volunteers. In order to improve our free and open service, we need your support. Please send us your feedback to info@openknowledgemaps.org.", + ); + await expect(page.locator("#info-body")).toContainText( + "If you want to support us financially, you can:", + ); + await expect(page.getByRole("list")).toContainText("Make a donation"); + await expect(page.getByRole("list")).toContainText( + "Become an organisational member", + ); + await expect(page.getByRole("list")).toContainText( + "Become a funder of our roadmap", + ); + await expect(page.locator("#info-body")).toContainText( + "Sign-up for our newsletter to receive occasional updates.", + ); + await expect( + page.getByRole("link", { name: "OKMaps logo" }), + ).toBeVisible(); + }); + + test("No query, no custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=&service=pubmed&sorting=most-relevant"; + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research based on 100 resources.", + ); + await expect(page.locator("#info-body")).toContainText( + "We use text similarity to create a knowledge map. The algorithm groups those resources together that have many words in common. Area titles are created from subject keywords of resources that have been assigned to the same area. We select those keywords and phrases that appear frequently in one area, and seldom in other areas.", + ); + await expect(page.locator("#info-body")).toContainText( + "Knowledge maps provide an instant overview of a topic by showing the main areas at a glance, and resources related to them. This makes it possible to easily identify useful, pertinent information.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about knowledge maps.", + ); + await expect(page.locator("#info-body")).toContainText("Data source"); + await expect(page.locator("#info-body")).toContainText( + "The data is taken from PubMed. PubMed comprises more than 38 million citations for biomedical literature from MEDLINE, life science journals, and online books. For more information please visit the PubMed website.Citations are available for resources with a DOI and based on citation data provided by Crossref. Results may be impacted by accuracy and completeness of this data.", + ); + await expect(page.locator("#info-body")).toContainText( + "Open source software", + ); + await expect(page.locator("#info-body")).toContainText( + "The visualization is created with the award winning open source software Head Start provided by Open Knowledge Maps. Open Knowledge Maps is a non-profit organisation run by a group of dedicated team members and volunteers. In order to improve our free and open service, we need your support. Please send us your feedback to info@openknowledgemaps.org.", + ); + await expect(page.locator("#info-body")).toContainText( + "If you want to support us financially, you can:", + ); + await expect(page.getByRole("list")).toContainText("Make a donation"); + await expect(page.getByRole("list")).toContainText( + "Become an organisational member", + ); + await expect(page.getByRole("list")).toContainText( + "Become a funder of our roadmap", + ); + await expect(page.locator("#info-body")).toContainText( + "Sign-up for our newsletter to receive occasional updates.", + ); + }); + + test("No query, custom title", async ({ page }) => { + const VISUALISATION_DYNAMIC_URL = + "/search?type=get&vis_type=overview&q=&service=pubmed&sorting=most-relevant"; + await prepareVisualisation(page, VISUALISATION_DYNAMIC_URL); + await page.goto( + "/map/f3bfddcad6bbdaef4647517827e6a6cb&custom_title=custom+title+via+URL", + ); + + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on custom title via URL based on the 100 most relevant resources matching your search query.", + ); + await expect(page.locator("#info-body")).toContainText( + "We use text similarity to create a knowledge map. The algorithm groups those resources together that have many words in common. Area titles are created from subject keywords of resources that have been assigned to the same area. We select those keywords and phrases that appear frequently in one area, and seldom in other areas.", + ); + await expect(page.locator("#info-body")).toContainText( + "Knowledge maps provide an instant overview of a topic by showing the main areas at a glance, and resources related to them. This makes it possible to easily identify useful, pertinent information.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about knowledge maps.", + ); + await expect(page.locator("#info-body")).toContainText( + "The data is taken from PubMed. PubMed comprises more than 38 million citations for biomedical literature from MEDLINE, life science journals, and online books. For more information please visit the PubMed website.Citations are available for resources with a DOI and based on citation data provided by Crossref. Results may be impacted by accuracy and completeness of this data.", + ); + await expect(page.locator("#info-body")).toContainText( + "The visualization is created with the award winning open source software Head Start provided by Open Knowledge Maps. Open Knowledge Maps is a non-profit organisation run by a group of dedicated team members and volunteers. In order to improve our free and open service, we need your support. Please send us your feedback to info@openknowledgemaps.org.", + ); + await expect(page.locator("#info-body")).toContainText( + "If you want to support us financially, you can:", + ); + await expect(page.getByRole("list")).toContainText("Make a donation"); + await expect(page.getByRole("list")).toContainText( + "Become an organisational member", + ); + await expect(page.getByRole("list")).toContainText( + "Become a funder of our roadmap", + ); + await expect(page.locator("#info-body")).toContainText( + "Sign-up for our newsletter to receive occasional updates.", + ); + await expect(page.locator("#info-title")).toContainText("What's this?"); + await expect(page.locator("#info-body")).toContainText("Data source"); + await expect(page.locator("#info-body")).toContainText( + "Open source software", + ); + }); + + test("Query, custom title", async ({ page }) => { + await page.goto( + "http://localhost:8085/map/6d9987f5edd8165da49a51774bc4f7a1&custom_title=custom+title+via+URL", + ); + await page.getByTestId("context").getByText("More information").click(); + await expect(page.locator("#info-body")).toContainText( + "This knowledge map presents you with a topical overview of research on custom title via URL based on the 100 most relevant resources matching your search query.", + ); + await expect(page.locator("#info-body")).toContainText( + "This visualization has a custom title and was created using the following query: infection", + ); + await expect(page.locator("#info-body")).toContainText( + "We use text similarity to create a knowledge map. The algorithm groups those resources together that have many words in common. Area titles are created from subject keywords of resources that have been assigned to the same area. We select those keywords and phrases that appear frequently in one area, and seldom in other areas.", + ); + await expect(page.locator("#info-body")).toContainText( + "Knowledge maps provide an instant overview of a topic by showing the main areas at a glance, and resources related to them. This makes it possible to easily identify useful, pertinent information.", + ); + await expect(page.locator("#info-body")).toContainText( + "Please read our FAQs to find out more about knowledge maps.", + ); + await expect(page.locator("#info-title")).toContainText("What's this?"); + await expect(page.locator("#info-body")).toContainText("Data source"); + await expect(page.locator("#info-body")).toContainText( + "The data is taken from PubMed. PubMed comprises more than 38 million citations for biomedical literature from MEDLINE, life science journals, and online books. For more information please visit the PubMed website.Citations are available for resources with a DOI and based on citation data provided by Crossref. Results may be impacted by accuracy and completeness of this data.", + ); + await expect(page.locator("#info-body")).toContainText( + "Open source software", + ); + await expect(page.locator("#info-body")).toContainText( + "The visualization is created with the award winning open source software Head Start provided by Open Knowledge Maps. Open Knowledge Maps is a non-profit organisation run by a group of dedicated team members and volunteers. In order to improve our free and open service, we need your support. Please send us your feedback to info@openknowledgemaps.org.", + ); + await expect(page.locator("#info-body")).toContainText( + "If you want to support us financially, you can:", + ); + await expect(page.getByRole("list")).toContainText("Make a donation"); + await expect(page.getByRole("list")).toContainText( + "Become an organisational member", + ); + await expect(page.getByRole("list")).toContainText( + "Become a funder of our roadmap", + ); + await expect(page.locator("#info-body")).toContainText( + "Sign-up for our newsletter to receive occasional updates.", + ); + }); + }); +}); diff --git a/local-hotreload.sh b/local-hotreload.sh index fb99215fd..2fbb94f34 100755 --- a/local-hotreload.sh +++ b/local-hotreload.sh @@ -9,6 +9,16 @@ source ./checks/ht-access.sh npm run prod -- --mode=development docker compose --env-file ./local_dev/dev.env stop docker compose --env-file ./local_dev/dev.env up -d --build + +# Populate the shared renv cache for all containers that use R. +# Required on first start or after an R version upgrade — subsequent starts +# are instant because the cache is bind-mounted from local_dev/renv/cache. +for container in dev-dataprocessing-1 dev-base-1 dev-pubmed-1 dev-openaire-1 dev-metrics-1; do + echo "Restoring R packages in $container..." + docker exec "$container" R --no-save -e 'renv::restore(prompt = FALSE)' 2>&1 \ + | grep -E "ERROR|error|✔|Installing|Successfully|already up" +done + cd ./local_dev/proxy docker compose down docker compose up -d diff --git a/local_dev/dev.env.example b/local_dev/dev.env.example new file mode 100644 index 000000000..14db555be --- /dev/null +++ b/local_dev/dev.env.example @@ -0,0 +1,30 @@ +COMPOSE_PROJECT_NAME=dev +SERVICE_VERSION=7d60186f594d420f82901f0514eb3c7e6b6e62d5 +POSTGRES_DB=postgres +POSTGRES_USER=headstart +POSTGRES_PASSWORD=testpgpassword +POSTGRES_HOSTS=dev-db-1 +POSTGRES_PORTS=5432 +POSTGRES_HOSTNAME=dev-db-1 +API_PORT=5001 +REDIS_HOST=dev-redis-1 +REDIS_PORT=6379 +REDIS_DB=0 +REDIS_PASSWORD=testredispassword +LOGLEVEL=DEBUG +LOGFILE="/var/log/headstart/headstart.log" + +BEHIND_PROXY=True +DEFAULT_DATABASE=dev +FLASK_ENV=development +COMPOSE_HTTP_TIMEOUT=300 + +R_BASE_APIKEY= +ORCID_CLIENT_ID= +ORCID_CLIENT_SECRET= + +R_ALTMETRIC_APIKEY= +R_CROSSREF_APIMAIL= +R_CROSSREF_PLUS_TOKEN= + +ENRICHMENT_STRATEGY_FOR_SUBJECT=replace \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9ff946509..e7a8f4383 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "@babel/preset-react": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "@eslint/js": "^9.29.0", + "@playwright/test": "^1.58.2", "@rollup/plugin-inject": "^5.0.5", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^14.3.1", @@ -2674,6 +2675,21 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -9511,6 +9527,50 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", diff --git a/package.json b/package.json index c233db724..586c7f1f0 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,11 @@ "eslint:check": "eslint .", "eslint:fix": "eslint . --fix", "prettier:check": "prettier . --check", - "prettier:fix": "prettier . --write" + "prettier:fix": "prettier . --write", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", + "test:e2e:headed": "playwright test --headed", + "test:e2e:with-environment-startup": "bash ./local-hotreload.sh && playwright test" }, "repository": { "type": "git", @@ -64,6 +68,7 @@ "@babel/preset-react": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "@eslint/js": "^9.29.0", + "@playwright/test": "^1.58.2", "@rollup/plugin-inject": "^5.0.5", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^14.3.1", diff --git a/playwright.benchmark.config.ts b/playwright.benchmark.config.ts new file mode 100644 index 000000000..7b7be326f --- /dev/null +++ b/playwright.benchmark.config.ts @@ -0,0 +1,24 @@ +import { defineConfig, devices } from "@playwright/test"; + +export default defineConfig({ + testDir: "./e2e/benchmark", + timeout: 10 * 60 * 1000, + expect: { timeout: 5 * 60 * 1000 }, + // Run serially — network contention between parallel tests would skew timings + fullyParallel: false, + workers: 1, + reporter: [ + ["list"], + ["html", { outputFolder: "benchmark-report", open: "never" }], + ], + use: { + trace: "off", + screenshot: "off", + // No baseURL — tests use full URLs from env vars / defaults in spec + }, + projects: [ + // Single browser for consistency; Chromium is fastest and closest to real usage + { name: "chromium", use: { ...devices["Desktop Chrome"] } }, + ], + // No webServer block — tests target external dev deployments +}); diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 000000000..4034cd39f --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,52 @@ +import { defineConfig, devices } from "@playwright/test"; + +export default defineConfig({ + // Folder for e2e tests + testDir: "./e2e", + // Maximum duration of a single test + timeout: 5 * 60 * 1000, + // Maximum time for expect() assertions (e.g. toBeVisible) + expect: { + timeout: 5 * 60 * 1000, + }, + // Allow running test files in parallel + fullyParallel: true, + // Protect against accidental commit of test.only in CI + forbidOnly: !!process.env.CI, + // Number of retries for failed tests + retries: process.env.CI ? 2 : 0, + // In CI, limit to one worker for stability + workers: process.env.CI ? 1 : undefined, + // Report format after running + reporter: "html", + // Explicitly specify the test files to run + testMatch: /.*\.spec\.ts/, + // Output directory for test artifacts (screenshots/traces/videos) + outputDir: "test-results/", + // Global browser context settings for all tests + use: { + // Base URL for page.goto("/path") + baseURL: "http://localhost:8085", + // Trace is collected only on the first retry (useful for debugging failures) + trace: "on-first-retry", + // Screenshot is saved only on test failure + screenshot: "only-on-failure", + }, + // Set of browsers/environments to run tests on + projects: [ + { name: "chromium", use: { ...devices["Desktop Chrome"] } }, + { name: "firefox", use: { ...devices["Desktop Firefox"] } }, + { name: "webkit", use: { ...devices["Desktop Safari"] } }, + ], + // Local dev server that is started before tests + webServer: { + // Command to start the application before tests + command: "npm start", + // URL that Playwright waits for the application to be ready + url: "http://localhost:8085", + // Reuse the already started server locally; in CI always start a new + reuseExistingServer: !process.env.CI, + // Maximum wait time for server startup + timeout: 120_000, + }, +}); diff --git a/server/classes/headstart/library/Toolkit.php b/server/classes/headstart/library/Toolkit.php index 3482798df..08c6229f2 100644 --- a/server/classes/headstart/library/Toolkit.php +++ b/server/classes/headstart/library/Toolkit.php @@ -100,7 +100,7 @@ public static function openOrCreateFile($file) { //now, we should be good, let's open or create the file $handle = fopen($file, "w+"); if ($handle == false) - throw new Exception("There was an error while opening/creating the following file: " . $file); + throw new \Exception("There was an error while opening/creating the following file: " . $file); return $handle; } diff --git a/server/classes/headstart/library/tests/README.md b/server/classes/headstart/library/tests/README.md new file mode 100644 index 000000000..c0b7e9a86 --- /dev/null +++ b/server/classes/headstart/library/tests/README.md @@ -0,0 +1,27 @@ +# About this folder + +This folder contains tests and their configurations for PHP scripts in the `library` folder. + +It contains three main folders: + +1. `functions` - folder with the tests; +2. `docker` - folder with the dockerfile; +3. `configuration` - folder for storing test configurations. + +Tests implemented using [`PHPUnit`](https://phpunit.de/index.html). All tests are run in the docker container. + +## How to run tests + +To run tests, you need to follow steps below (run them from the root folder level of the project): + +1. Build a docker container: + + ``` + docker build -t php-test server/classes/headstart/library/tests/docker + ``` + +2. Run the container with tests: + + ``` + docker run --rm -v $(pwd)/server/classes/headstart/library:/app php-test phpunit --configuration tests/configuration/phpunit.xml + ``` diff --git a/server/classes/headstart/library/tests/configuration/phpunit.xml b/server/classes/headstart/library/tests/configuration/phpunit.xml new file mode 100644 index 000000000..c69695696 --- /dev/null +++ b/server/classes/headstart/library/tests/configuration/phpunit.xml @@ -0,0 +1,14 @@ + + + + + ../functions + + + \ No newline at end of file diff --git a/server/classes/headstart/library/tests/docker/Dockerfile b/server/classes/headstart/library/tests/docker/Dockerfile new file mode 100644 index 000000000..5dabbeafd --- /dev/null +++ b/server/classes/headstart/library/tests/docker/Dockerfile @@ -0,0 +1,27 @@ +# Setup PHP using the project version +FROM php:8.2-cli + +# Installing dependencies +RUN apt-get update && apt-get install -y \ + git \ + unzip \ + curl \ + libcurl4-openssl-dev \ + pkg-config \ + libssl-dev \ + libxml2-dev \ + file + +# Installing composer and PHPUnit +RUN curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer +RUN composer global require phpunit/phpunit mikey179/vfsstream +ENV PATH="/root/.composer/vendor/bin:$PATH" + +# Defining working directory inside the container +WORKDIR /app + +# Creation of the output-file for saving .pdf files (mocking them) +RUN mkdir -p /path/to/paper_preview/ +RUN touch /path/to/paper_preview/test-file.pdf + +CMD ["phpunit"] \ No newline at end of file diff --git a/server/classes/headstart/library/tests/functions/CommUtilsTest.php b/server/classes/headstart/library/tests/functions/CommUtilsTest.php new file mode 100644 index 000000000..8d3f90d5a --- /dev/null +++ b/server/classes/headstart/library/tests/functions/CommUtilsTest.php @@ -0,0 +1,57 @@ + 'myFunc']; + + $this->expectOutputString('myFunc({"status":"ok"});'); + CommUtils::echoOrCallback($data, $params); + } + + /** + * Tests that raw data is echoed when the 'jsoncallback' parameter + * is not provided. + */ + public function testEchoOrCallbackWithoutCallback(): void { + $data = '{"status":"ok"}'; + $params = []; + + $this->expectOutputString('{"status":"ok"}'); + CommUtils::echoOrCallback($data, $params); + } + + /** + * Tests that the correct value is returned for a parameter that exists + * in the input array. + */ + public function testGetParameterExists(): void { + $params = ['id' => '123', 'query' => 'test']; + + $this->assertEquals('123', CommUtils::getParameter($params, 'id')); + $this->assertEquals('test', CommUtils::getParameter($params, 'query')); + } + + /** + * Tests that an Exception is thrown when a requested parameter + * does not exist in the input array. + */ + public function testGetParameterNotExists(): void { + $params = ['id' => '123']; + + $this->expectException(\Exception::class); + $this->expectExceptionMessage('The following parameter is not set: query'); + CommUtils::getParameter($params, 'query'); + } +} \ No newline at end of file diff --git a/server/classes/headstart/library/tests/functions/ToolkitTest.php b/server/classes/headstart/library/tests/functions/ToolkitTest.php new file mode 100644 index 000000000..ca003cebf --- /dev/null +++ b/server/classes/headstart/library/tests/functions/ToolkitTest.php @@ -0,0 +1,70 @@ +root = vfsStream::setup('root'); + } + + /** + * Testing function - loadIni. + * + * Loads a `config_local.ini` correctly when it is exists + * and ignore a `config.ini`. + */ + public function testLoadIniLoadsLocalConfigWhenExists(): void { + $configContent = "[database]\nhost = default_db_host"; + $localConfigContent = "[database]\nhost = local_db_host"; + + vfsStream::newFile('config.ini')->withContent($configContent)->at($this->root); + vfsStream::newFile('config_local.ini')->withContent($localConfigContent)->at($this->root); + + $result = Toolkit::loadIni($this->root->url() . '/'); + $expected = [ + 'database' => [ + 'host' => 'local_db_host' + ] + ]; + + $this->assertEquals($expected, $result); + } + + /** + * Testing function - loadIni. + * + * Function returns false if no configuration files were found. + */ + public function testLoadIniReturnsFalseWhenNoConfigFilesExist(): void { + $result = @Toolkit::loadIni($this->root->url() . '/'); + $this->assertFalse($result); + } + + /** + * Testing function - loadIni. + * + * Function loads a `config.ini` by default if a `config_local.ini` is missing. + */ + public function testLoadIniLoadsDefaultConfigWhenLocalIsMissing(): void { + $configContent = "[server]\nurl = https://some-example.com"; + vfsStream::newFile('config.ini')->withContent($configContent)->at($this->root); + + $result = Toolkit::loadIni($this->root->url() . '/'); + $expected = [ + 'server' => [ + 'url' => 'https://some-example.com' + ] + ]; + + $this->assertEquals($expected, $result); + } +} \ No newline at end of file diff --git a/server/preprocessing/other-scripts/metrics.R b/server/preprocessing/other-scripts/metrics.R index 45be3aa12..8c149892c 100644 --- a/server/preprocessing/other-scripts/metrics.R +++ b/server/preprocessing/other-scripts/metrics.R @@ -6,6 +6,8 @@ mlog <- getLogger("metrics") apikey_altmetric <- Sys.getenv("R_ALTMETRIC_APIKEY") email_crossref <- Sys.getenv("R_CROSSREF_APIMAIL") +crossref_plus_token <- Sys.getenv("R_CROSSREF_PLUS_TOKEN") +crossref_batch_size <- as.integer(Sys.getenv("R_CROSSREF_BATCH_SIZE", unset = "50")) enrich_metadata_metrics <- function(metadata, metrics_sources=c("altmetric", "crossref")) { start.time <- Sys.time() @@ -95,24 +97,19 @@ add_citations <- function(metadata) { dois <- metadata$doi valid_dois <- unique(dois[which(dois != "")]) + use_plus <- nchar(crossref_plus_token) > 0 + cc <- tryCatch( - { - cc_list <- list() - for (doi in valid_dois) { - tryCatch({ - count <- cr_citation_count(doi = doi, key = email_crossref) - cc_list <- append(cc_list, list(count)) - }, error = function(err) { - mlog$debug(gsub("[\r\n]", "", paste(err, doi, sep = " "))) - cc_list <- append(cc_list, list(list(doi = doi, count = NA))) - }) - Sys.sleep(0.1) # to avoid hitting rate limits - } - cc <- do.call(rbind.fill, cc_list) - }, + cr_citation_count( + doi = valid_dois, + key = email_crossref, + async = !use_plus, + plus_token = crossref_plus_token, + batch_size = crossref_batch_size + ), error = function(err) { - mlog$debug(gsub("[\r\n]", "", paste(err, doi, sep = " "))) - return(list(doi = dois, count = NA)) + mlog$error(gsub("[\r\n]", "", paste(err, sep = " "))) + data.frame(doi = valid_dois, count = NA_integer_, stringsAsFactors = FALSE) } ) names(cc)[names(cc) == "count"] <- "citation_count" diff --git a/server/workers/api/requirements.txt b/server/workers/api/requirements.txt index 125c4b9f2..fcb4406af 100644 --- a/server/workers/api/requirements.txt +++ b/server/workers/api/requirements.txt @@ -8,7 +8,8 @@ dataclasses>=0.6 flasgger==0.9.7.1 Flask==3.0.0 Flask-Cors==4.0.0 -flask-restx==1.3.0 +flask-restx==1.3.2 +referencing==0.34.0 gunicorn==21.2.0 hiredis==2.0.0 importlib-metadata==4.8.3 diff --git a/server/workers/build_docker_images.sh b/server/workers/build_docker_images.sh index 22be4cc32..80a6bce44 100755 --- a/server/workers/build_docker_images.sh +++ b/server/workers/build_docker_images.sh @@ -55,4 +55,4 @@ done echo "" echo "Finished building services with version $service_version" -echo "" \ No newline at end of file +echo "" diff --git a/server/workers/common/common/contentproviders.json b/server/workers/common/common/contentproviders.json index f0bcdcd59..ee7f175a8 100644 --- a/server/workers/common/common/contentproviders.json +++ b/server/workers/common/common/contentproviders.json @@ -1,4 +1,620 @@ [ + { + "name": "Institutional Repository DAU", + "internal_name": "ftid14799" + }, + { + "name": "DIRENO - Digitales Repositorium Niederösterreich", + "internal_name": "ftid14801" + }, + { + "name": "Current Legal Problems", + "internal_name": "ftid14800" + }, + { + "name": "South American Publishing", + "internal_name": "ftid14798" + }, + { + "name": "IQVerse", + "internal_name": "ftid14810" + }, + { + "name": "DergiPark Akademik", + "internal_name": "ftid14822" + }, + { + "name": "Journal of Global Perspectives in Communication and Media (JGPCM)", + "internal_name": "ftid14823" + }, + { + "name": "Repositório Institucional da Fasipe", + "internal_name": "ftid14833" + }, + { + "name": "OpenXiv", + "internal_name": "ftid14852" + }, + { + "name": "CamEd Open Access Repository", + "internal_name": "ftid14855" + }, + { + "name": "Amoud University Institutional Repository", + "internal_name": "ftid14856" + }, + { + "name": "Editorial Didaxis", + "internal_name": "ftid14797" + }, + { + "name": "Nauka i tehnologija (International University Travnik)", + "internal_name": "ftid14819" + }, + { + "name": "GSMS Publications (Green and Sustainable Materials Society)", + "internal_name": "ftid14808" + }, + { + "name": "Jurnal di STMIK EL RAHMA Yogyakarta", + "internal_name": "ftid14811" + }, + { + "name": "Publishing House \"Scientometric Center\" (Журнал биологических наук и сельского хозяйства)", + "internal_name": "crid14812" + }, + { + "name": "Nexus House Editorial", + "internal_name": "ftid14818" + }, + { + "name": "Jurnal Ilmiah", + "internal_name": "ftid14820" + }, + { + "name": "Universitas Insan Budi Utomo", + "internal_name": "ftid14821" + }, + { + "name": "Pondok Jurnal", + "internal_name": "ftid14825" + }, + { + "name": "Michelangelo Scholar Publishing Limited (MSPL)", + "internal_name": "ftid14826" + }, + { + "name": "Athenaeum Scientific Publishers", + "internal_name": "crid14827" + }, + { + "name": "Omega Journals", + "internal_name": "ftid14828" + }, + { + "name": "Hala Foundation Journals", + "internal_name": "ftid14830" + }, + { + "name": "Sociological Studios", + "internal_name": "ftid14832" + }, + { + "name": "World Organization of Applied Sciences", + "internal_name": "ftid14835" + }, + { + "name": "Compusoft", + "internal_name": "ftid14837" + }, + { + "name": "International Academic Research Center (IARC) - Florida Global University (FGU)", + "internal_name": "ftid14838" + }, + { + "name": "Bhutan Journal of Business and Management", + "internal_name": "ftid14839" + }, + { + "name": "Interdisciplinary Applied Qualifications", + "internal_name": "ftid14840" + }, + { + "name": "TSUE Scientific Journal", + "internal_name": "ftid14843" + }, + { + "name": "DORA WSL", + "internal_name": "ftid14844" + }, + { + "name": "DORA PSI", + "internal_name": "ftid14845" + }, + { + "name": "Mahkota Science Publishers", + "internal_name": "ftid14846" + }, + { + "name": "TRESEARCH Technology Journals Platform", + "internal_name": "ftid14847" + }, + { + "name": "Pubris", + "internal_name": "ftid14849" + }, + { + "name": "E-Journal Al-Bayan Institute", + "internal_name": "ftid14850" + }, + { + "name": "NIBM Journal of Knowledge Innovation", + "internal_name": "ftid14851" + }, + { + "name": "International Multidisciplinary Journal of Emerging Technologies and Applications (IMJETA)", + "internal_name": "ftid14853" + }, + { + "name": "Jurnal Contradixie", + "internal_name": "ftid14854" + }, + { + "name": "Journal of national culture", + "internal_name": "ftid14780" + }, + { + "name": "Portal de Periódicos do IFRS", + "internal_name": "ftid14802" + }, + { + "name": "data.THM - Datenrepositorium der Technischen Hochschule Mittelhessen", + "internal_name": "ftid14729" + }, + { + "name": "İstanbul Esenyurt Üniversitesi Kurumsal Akademik Arşivi", + "internal_name": "ftid14731" + }, + { + "name": "SOLAV Journal (A Scholarly Platform for Interdisciplinary Applied Futures Research)", + "internal_name": "ftid14736" + }, + { + "name": "Sulaimani Dental Journal", + "internal_name": "ftid14738" + }, + { + "name": "Revista Entreparágrafos", + "internal_name": "ftid14739" + }, + { + "name": "CACTUS – Journal of Tourism Business, Management and Economics", + "internal_name": "ftid14746" + }, + { + "name": "Dandakaranya Review Journal", + "internal_name": "ftid14749" + }, + { + "name": "Journal of Lie Theory", + "internal_name": "ftid14763" + }, + { + "name": "STAI Di Al-Hikmah Jakarta", + "internal_name": "ftid14773" + }, + { + "name": "Didaxis. Revista Educativa, Social y Humanista", + "internal_name": "ftid14775" + }, + { + "name": "Physical and Mathematical Education", + "internal_name": "ftid14777" + }, + { + "name": "Education. Innovation. Practice", + "internal_name": "ftid14778" + }, + { + "name": "Publications Lawusn", + "internal_name": "ftid14781" + }, + { + "name": "Hessisches Kommunalrechtslexikon", + "internal_name": "ftid14782" + }, + { + "name": "Casting processes", + "internal_name": "ftid14783" + }, + { + "name": "Journal of Big Data and Artificial Intelligence", + "internal_name": "ftid14784" + }, + { + "name": "Luminis Editorial", + "internal_name": "ftid14785" + }, + { + "name": "Repositorio Institucional de la Superintendencia del Mercado de Valores (SMV)", + "internal_name": "ftid14786" + }, + { + "name": "Sorsogon Multidisciplinary Research Journal", + "internal_name": "ftid14787" + }, + { + "name": "Medical Journal of Soeradji", + "internal_name": "ftid14788" + }, + { + "name": "Revista Portuguesa de Doenças Infecciosas", + "internal_name": "ftid14790" + }, + { + "name": "Focuscholar", + "internal_name": "ftid14791" + }, + { + "name": "Australian Journal of Artificial Intelligence Review", + "internal_name": "ftid14792" + }, + { + "name": "Trends in Intellectual Property Research", + "internal_name": "ftid14793" + }, + { + "name": "Journal of Material Characterization and Applications", + "internal_name": "ftid14795" + }, + { + "name": "Jurnal Online Kesehatan Indonesia", + "internal_name": "ftid14796" + }, + { + "name": "UW Journal of Management Sciences (UWJMS)", + "internal_name": "ftid14803" + }, + { + "name": "UW Journal of Social Sciences (UWJSS)", + "internal_name": "ftid14805" + }, + { + "name": "University of Wah Journal of Computer Science (UWJCS)", + "internal_name": "ftid14806" + }, + { + "name": "New Journal of Biology and Medicine", + "internal_name": "ftid14813" + }, + { + "name": "Gemini Littera", + "internal_name": "ftid14814" + }, + { + "name": "İnsan İzi Dergisi", + "internal_name": "ftid14815" + }, + { + "name": "Gio Edutech", + "internal_name": "ftid14816" + }, + { + "name": "Pensamiento Numinal: Revista de Ciencias Sociales y Humanidades", + "internal_name": "ftid14817" + }, + { + "name": "Journal Regalia Institute", + "internal_name": "ftid14768" + }, + { + "name": "Literati Global Network", + "internal_name": "ftid14713" + }, + { + "name": "Afghan International Journal of Science (AIJS)", + "internal_name": "ftid14754" + }, + { + "name": "Dasinya Journal for Engineering and Informatics", + "internal_name": "ftid14755" + }, + { + "name": "Ceniiac Journal", + "internal_name": "ftid14756" + }, + { + "name": "REGRASP (Revista para Graduandos/Instituto Federal de Educação, Ciência e Tecnologia de São Paulo)", + "internal_name": "ftid14757" + }, + { + "name": "Journal Nacreva", + "internal_name": "ftid14758" + }, + { + "name": "Gabungan Riset Edukasi dan Eksplorasi Teori (GREET)", + "internal_name": "ftid14759" + }, + { + "name": "Era Scientific Publisher (ESP)", + "internal_name": "ftid14760" + }, + { + "name": "Revista IESB", + "internal_name": "ftid14761" + }, + { + "name": "PT. Berkah Smart Academica", + "internal_name": "ftid14762" + }, + { + "name": "Tér – Gazdaság – Ember / Journal of Region, Economy and Society", + "internal_name": "ftid14764" + }, + { + "name": "EL-IQTISHAD: Journal Economics, Business and Sharia Studies", + "internal_name": "ftid14765" + }, + { + "name": "Bangladesh Journal of Dental Research & Education (BJDRE)", + "internal_name": "ftid14766" + }, + { + "name": "Sofist: An International Journal of Philosophy", + "internal_name": "ftid14767" + }, + { + "name": "Education@ETMA", + "internal_name": "ftid14769" + }, + { + "name": "PEARL Multidisciplinary Journal", + "internal_name": "ftid14770" + }, + { + "name": "Ecosistema, revista de educación y medioambiente", + "internal_name": "ftid14771" + }, + { + "name": "Portal de Revistas Universidad del Atlántico", + "internal_name": "ftid14772" + }, + { + "name": "Revista Econômica do Nordeste", + "internal_name": "ftid14670" + }, + { + "name": "Cagayan State University (CSU)", + "internal_name": "ftid14732" + }, + { + "name": "Revista Internacional de Ciencias Económicas y Sociales RICESO", + "internal_name": "ftid14733" + }, + { + "name": "iEditore Journals", + "internal_name": "ftid14734" + }, + { + "name": "Journal of Engineering Research (Libya)", + "internal_name": "ftid14735" + }, + { + "name": "Journal of Biomedical Research & Environmental Sciences (JBRES)", + "internal_name": "ftid14740" + }, + { + "name": "Archives of Criminology and Forensic Sciences", + "internal_name": "ftid14741" + }, + { + "name": "Ellinger Publishing Media", + "internal_name": "ftid14742" + }, + { + "name": "Jurnal Universitas Sali Al", + "internal_name": "ftid14748" + }, + { + "name": "Global Insights in Biomedical & Multidisciplinary Research (GIBMR)", + "internal_name": "ftid14751" + }, + { + "name": "International Journal of Applied Artificial Intelligence and Robotics (IJAIC)", + "internal_name": "ftid14752" + }, + { + "name": "Edinburgh Multicultural Research Institute (EMRI) Journal Collection", + "internal_name": "ftid14753" + }, + { + "name": "Global Talent Foundation Inc", + "internal_name": "crid14737" + }, + { + "name": "TSARKA Science", + "internal_name": "crid14743" + }, + { + "name": "North American Publication Corp. (NAPOpen)", + "internal_name": "crid14789" + }, + { + "name": "Paradigma Journal of Social Sciences", + "internal_name": "crid14807" + }, + { + "name": "Journal Of Wound Medicine", + "internal_name": "ftid14709" + }, + { + "name": "Editorial Saberes Científicos", + "internal_name": "ftid14712" + }, + { + "name": "Editorial FIECYT", + "internal_name": "ftid14716" + }, + { + "name": "Universidad Nacional del Altiplano, Puno, Perú - Escuela de Posgrado", + "internal_name": "ftid14720" + }, + { + "name": "Department of Philosophy, Niger Delta University", + "internal_name": "ftid14723" + }, + { + "name": "AISI Journal of Sensory Integration and Child Development", + "internal_name": "ftid14724" + }, + { + "name": "منصة المجلات العلمية لجامعة المسيلة", + "internal_name": "ftid14727" + }, + { + "name": "Arado Business Journal (ABJ)", + "internal_name": "ftid14725" + }, + { + "name": "Universitätsbibliothek der Eberhard Karls Universität Tübingen / IxTheo: OJS", + "internal_name": "ftid14726" + }, + { + "name": "Periódicos - UFAM", + "internal_name": "ftid14728" + }, + { + "name": "Portal de Periódicos Eletrônicos FASIPE", + "internal_name": "ftid14730" + }, + { + "name": "Repositorio Institucional del Instituto de Investigaciones de la Amazonía Peruana - IIAP", + "internal_name": "ftid14705" + }, + { + "name": "Revista Inquietações", + "internal_name": "ftid14708" + }, + { + "name": "Advanced Social Science in Research Journal (ASSRJ)", + "internal_name": "ftid14701" + }, + { + "name": "Akrual: Jurnal Tugas Akhir Mahasiswa (JTAM)", + "internal_name": "ftid14702" + }, + { + "name": "International Journal of Pharmaceutical Drug Design (IJPDD)", + "internal_name": "ftid14703" + }, + { + "name": "Shodhbodhalaya", + "internal_name": "ftid14704" + }, + { + "name": "Current Pharmaceutical Research (CPR)", + "internal_name": "ftid14706" + }, + { + "name": "Jurnal Teologi Oligos", + "internal_name": "ftid14707" + }, + { + "name": "Journal of Digital Innovation and Social Research (JDISR)", + "internal_name": "ftid14710" + }, + { + "name": "Applied Planetary Health (APH)", + "internal_name": "ftid14711" + }, + { + "name": "HRL Journal Service", + "internal_name": "ftid14714" + }, + { + "name": "International Journal of Advanced Research and Innovations (IJARI)", + "internal_name": "ftid14717" + }, + { + "name": "Current Pharmaceutical Letters and Reviews (CPLR)", + "internal_name": "ftid14718" + }, + { + "name": "Creative Smart Visionary", + "internal_name": "ftid14719" + }, + { + "name": "International Journal of Constitutional and Administrative Law", + "internal_name": "ftid14721" + }, + { + "name": "J-MILE: Journal of Management and Industrial Engineering", + "internal_name": "ftid14722" + }, + { + "name": "електронний репозитарій Українського католицького університету", + "internal_name": "ftlvivcatholicun" + }, + { + "name": "Portal de Periódicos do IFSP Itapetininga (Instituto Federal de Educação Ciência e Tecnologia de São Paulo)", + "internal_name": "ftifspitapetinin" + }, + { + "name": "Repositorio Digital de la Universidad del Magdalena", + "internal_name": "ftunivmagdalena" + }, + { + "name": "İstanbul Medipol University Institutional Repository (DSpace@Medipol)", + "internal_name": "ftistanbulmedipo" + }, + { + "name": "Revista Tópicos", + "internal_name": "ftid14744" + }, + { + "name": "United Journal of Chemistry", + "internal_name": "ftid14745" + }, + { + "name": "Istanbul Medeniyet University", + "internal_name": "ftid14698" + }, + { + "name": "RepoWest: Open-Access-Publikationsserver der Fachhochschule Westküste", + "internal_name": "ftid14683" + }, + { + "name": "Ege University", + "internal_name": "ftid14691" + }, + { + "name": "INKUBIS: Jurnal Ekonomi dan Bisnis", + "internal_name": "ftid14576" + }, + { + "name": "African Journal for Development Informatics (AJDI)", + "internal_name": "ftid14673" + }, + { + "name": "Revista Entropía Educativa", + "internal_name": "ftid14679" + }, + { + "name": "Repositorio de Conocimiento Entropía Educativa", + "internal_name": "ftid14682" + }, + { + "name": "Journal Azzahro", + "internal_name": "ftid14697" + }, + { + "name": "Revista Internacional Educon", + "internal_name": "ftid14699" + }, + { + "name": "International Journal of Innovations in Engineering Technology and Applied Sciences (IJIETAS)", + "internal_name": "ftid14700" + }, { "name": "VMRF Digital Repository", "internal_name": "ftid14684" @@ -11,10 +627,6 @@ "name": "CityUHK Scholars", "internal_name": "ftid14687" }, - { - "name": "Evolutio Press", - "internal_name": "ftid14688" - }, { "name": "Perry Research", "internal_name": "ftid14689" @@ -40,13 +652,9 @@ "internal_name": "ftid14674" }, { - "name": "Proceedings Centre-Mersenne", + "name": "Books, Proceedings and Seminars of Centre Mersenne", "internal_name": "ftid14678" }, - { - "name": "United Journal of Chemistry", - "internal_name": "crid14680" - }, { "name": "University of Biskra Journals", "internal_name": "ftid14681" @@ -207,10 +815,6 @@ "name": "EditorJDTET", "internal_name": "ftid14639" }, - { - "name": "Revista Tópicos", - "internal_name": "crid14640" - }, { "name": "International Journal of Health Concord", "internal_name": "ftid14642" @@ -2943,6 +3547,10 @@ "name": "Journal of the Institute for Biblical Aramaic Studies", "internal_name": "ftid13960" }, + { + "name": "Edu Science Indonesia", + "internal_name": "ftid13946" + }, { "name": "Orthotomeo - Jurnal Penelitian Ilmiah", "internal_name": "ftid13933" @@ -10812,7 +11420,7 @@ "internal_name": "ftuaaguascalient" }, { - "name": "Portail de Revues Scientifiques Marocaines IMIST (Institut Marocain de l’Information Scientifique et Technique)", + "name": "Portail des Revues Scientifiques Marocaines (PRSM)", "internal_name": "ftinstmistojs" }, { @@ -18075,10 +18683,6 @@ "name": "Ufuk Universitesi Akademik Acikerisim Sistemi", "internal_name": "ftufukuniv" }, - { - "name": "Abdelhamid Mehri University Constantine2 ScholarlyWorks Repository", - "internal_name": "ftunivconst2" - }, { "name": "Jurnal Online IAIN Madura", "internal_name": "ftiainmaduojs" @@ -20287,10 +20891,6 @@ "name": "International Academy Publishing (IAP)", "internal_name": "crintacademypubl" }, - { - "name": "Maxwell Scientific Publication Corp.", - "internal_name": "crmaxwellscipubl" - }, { "name": "oekom", "internal_name": "croekompubl" @@ -23951,10 +24551,6 @@ "name": "Online Journal System STAIDA (Sekolah Tinggi Agama Islam Daruttaqwa Gresik Jurnal Online)", "internal_name": "ftstaidaruttaqwa" }, - { - "name": "İstanbul Medipol University Institutional Repository (DSpace@Medipol)", - "internal_name": "ftistanbulmedipo" - }, { "name": "E-Jurnal STKIP Pesisir Selatan - Lembaga Penelitian dan Pengabdian kepada Masysrakat (LP2M)", "internal_name": "ftstkippesisirse" @@ -26547,10 +27143,6 @@ "name": "Indonesian Journal of Health Research (IJHR)", "internal_name": "ftjijhr" }, - { - "name": "The Scientific Journals of the University of Kurdistan Hewlêr", - "internal_name": "ftunikurdistanhe" - }, { "name": "Sistema Eletrônico de Periódicos - IFCH/Unicamp (Instituto de Filosofia e Ciências Humanas da Universidade Estadual de Campinas)", "internal_name": "ftuncampinasifch" @@ -37099,10 +37691,6 @@ "name": "Digital Commons @ Kettering University", "internal_name": "ftketteringuniv" }, - { - "name": "Portal de Periódicos do IFSP Itapetininga (Instituto Federal de Educação Ciência e Tecnologia de São Paulo)", - "internal_name": "ftifspitapetinin" - }, { "name": "東京海洋大学学術機関リポジトリ", "internal_name": "fttokyounivmst" @@ -37467,10 +38055,6 @@ "name": "Репозиторий Полоцкого государственного университета имени Евфросинии Полоцкой", "internal_name": "ftpolozksuniv" }, - { - "name": "Fatih Sultan Mehmet Vakıf Üniversitesi (FSMVÜ)", - "internal_name": "ftfsmvakifuniv" - }, { "name": "International Journal of the Commons", "internal_name": "ftjijotc" @@ -37944,7 +38528,7 @@ "internal_name": "ftecoleminesnant" }, { - "name": "École Polytechnique, Université Paris-Saclay: HAL", + "name": "Portail HAL Polytechnique (École Polytechnique / Institut Polytechnik de Paris)", "internal_name": "ftepunivpsaclay" }, { @@ -38411,10 +38995,6 @@ "name": "DSpace-CRIS @ ANLIS (Administración Nacional de Laboratorios e Institutos de Salud)", "internal_name": "ftanlis" }, - { - "name": "електронний репозитарій Українського католицького університету", - "internal_name": "ftlvivcatholicun" - }, { "name": "九州保健福祉大学リポジトリ", "internal_name": "ftkyushuunivhw" @@ -38803,10 +39383,6 @@ "name": "Universitas Semarang Jurusan: SIJALU - Sistem Informasi Jurnal Ilmiah USM", "internal_name": "ftunivsemarojs" }, - { - "name": "TECNALIA Publications (Fundación TECNALIA Research & Innovation)", - "internal_name": "fttecnalia" - }, { "name": "The University of Melbourne: Digitised Collections", "internal_name": "ftumelbournedc" @@ -42519,10 +43095,6 @@ "name": "Pittsburgh Papers on the European Union (University of Pittsburgh)", "internal_name": "ftjppeu" }, - { - "name": "027.7 Zeitschrift für Bibliothekskultur", - "internal_name": "ftj0277" - }, { "name": "Bundesanstalt für Straßenwesen (BASt): Elektronisches BASt-Archiv (ELBA)", "internal_name": "ftbastrassen" @@ -43335,10 +43907,6 @@ "name": "Rollins College: Rollins Scholarship Online (RSO)", "internal_name": "ftrollinscollege" }, - { - "name": "公立はこだて未来大学", - "internal_name": "ftfunivhakodate" - }, { "name": "Revista de la Asociación Española de Neuropsiquiatría", "internal_name": "ftjaen" @@ -44351,10 +44919,6 @@ "name": "University for the Creative Arts: UCA Research Online", "internal_name": "ftcreativearts" }, - { - "name": "The London School of Economics and Political Science: LSE Theses Online", - "internal_name": "ftlschooleconom" - }, { "name": "Repositorio de trabajos finales del Taller de Diseño Industrial (Cátedra Gálan) de la Carrera de Diseño Industrial (FADU - Facultad de Arquitectura, Diseño y Urbanismo, UBA - Universida de Buenos Aires)", "internal_name": "ftunibadiana" @@ -45840,7 +46404,7 @@ "internal_name": "ftlapress" }, { - "name": "University of South Africa: UNISA Institutional Repository", + "name": "Unisa Institutional Repository (UnisaIR - University of South Africa)", "internal_name": "ftunivsafrica" }, { @@ -46156,7 +46720,7 @@ "internal_name": "ftcochinuniv" }, { - "name": "The University of Western Ontario: Scholarship@Western", + "name": "Western University Open Repository", "internal_name": "ftunivwestonta" }, { @@ -46540,7 +47104,7 @@ "internal_name": "ftihe" }, { - "name": "TU Darmstadt: tuprints", + "name": "TUprints - Publikationsplattform der TU Darmstadt", "internal_name": "ftulbdarmstadt" }, { @@ -46579,10 +47143,6 @@ "name": "Universiti Utara Malaysia: UUM IRepository", "internal_name": "ftunivutaramal" }, - { - "name": "WikiBooks - Inhaltsoffene Lehrbücher", - "internal_name": "ftwikibooks" - }, { "name": "岡山大学学術成果リポジトリ", "internal_name": "ftokayamaunivoud" @@ -47012,7 +47572,7 @@ "internal_name": "ftcalpoly" }, { - "name": "Repositorio Institucional - UNI (Universidad Nacional de Ingeniería, Lima, Peru)", + "name": "Repositorio Institucional Universidad Nacional de Ingeniería", "internal_name": "ftunivnilima" }, { @@ -48811,10 +49371,6 @@ "name": "Media SuUB Bremen (Staats- und Universitätsbibliothek Bremen)", "internal_name": "ftsubbremen" }, - { - "name": "Edu Science Indonesia", - "internal_name": "ftid13946" - }, { "name": "GoTriple", "internal_name": "fttriple" diff --git a/server/workers/dataprocessing/Dockerfile b/server/workers/dataprocessing/Dockerfile index ca78a079d..c7f49f90a 100644 --- a/server/workers/dataprocessing/Dockerfile +++ b/server/workers/dataprocessing/Dockerfile @@ -153,6 +153,7 @@ COPY workers/dataprocessing/renv.lock . COPY workers/dataprocessing/activate.R . RUN R -e 'renv::consent(provided = TRUE)' && \ + R -e 'install.packages(c("gplots", "fossil", "foreach", "doParallel"), repos = "https://cran.wu.ac.at")' && \ R -e 'setwd("./"); renv::activate(); renv::restore(lockfile = "./renv.lock")' COPY workers/common ../common diff --git a/server/workers/metrics/Dockerfile b/server/workers/metrics/Dockerfile index d42d901b0..30d675327 100644 --- a/server/workers/metrics/Dockerfile +++ b/server/workers/metrics/Dockerfile @@ -1,165 +1,52 @@ -FROM ubuntu:20.04 +FROM rocker/r-ver:4.4.2 LABEL maintainer="Chris Kittel " ENV DEBIAN_FRONTEND=noninteractive -ARG R_VERSION -ARG BUILD_DATE -ARG CRAN -## Setting a BUILD_DATE will set CRAN to the matching MRAN date -## No BUILD_DATE means that CRAN will default to latest -ENV R_VERSION=${R_VERSION:-3.6.3} \ - CRAN=${CRAN:-https://cran.rstudio.com} - -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - bash-completion \ - ca-certificates \ - file \ - fonts-texgyre \ - g++ \ - gfortran \ - gsfonts \ - libblas-dev \ - libbz2-1.0 \ - libcurl4 \ - libjpeg-turbo8-dev \ - libopenblas-dev \ - libpangocairo-1.0-0 \ - libpcre3 \ - libpng16-16 \ - libreadline-dev \ - libtiff5 \ - liblzma5 \ +RUN apt-get update && apt-get install -y --no-install-recommends \ locales \ - make \ - unzip \ - zip \ - zlib1g \ - && BUILDDEPS="curl \ - default-jdk \ - libbz2-dev \ - libcairo2-dev \ + curl \ + vim \ + python3 \ + python3-dev \ + python3-pip \ libcurl4-openssl-dev \ - libpango1.0-dev \ - libjpeg-dev \ - libpcre3-dev \ - libpng-dev \ - libreadline-dev \ - libtiff5-dev \ - liblzma-dev \ - libx11-dev \ - libxt-dev \ - perl \ - tcl8.6-dev \ - tk8.6-dev \ - x11proto-core-dev \ - xauth \ - xfonts-base \ - xvfb \ - zlib1g-dev" \ - && apt-get install -y --no-install-recommends $BUILDDEPS \ - && cd tmp/ \ - ## Download source code - && curl -O https://cran.r-project.org/src/base/R-3/R-${R_VERSION}.tar.gz \ - ## Extract source code - && tar -xf R-${R_VERSION}.tar.gz \ - && cd R-${R_VERSION} \ - ## Set compiler flags - && R_PAPERSIZE=letter \ - R_BATCHSAVE="--no-save --no-restore" \ - R_BROWSER=xdg-open \ - PAGER=/usr/bin/pager \ - PERL=/usr/bin/perl \ - R_UNZIPCMD=/usr/bin/unzip \ - R_ZIPCMD=/usr/bin/zip \ - R_PRINTCMD=/usr/bin/lpr \ - LIBnn=lib \ - AWK=/usr/bin/awk \ - CFLAGS="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g" \ - CXXFLAGS="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g" \ - ## Configure options - ./configure --enable-R-shlib \ - --enable-memory-profiling \ - --with-readline \ - --with-blas \ - --with-tcltk \ - --disable-nls \ - --with-recommended-packages \ - ## Build and install - && make \ - && make install \ - ## Add a library directory (for user-installed packages) - && mkdir -p /usr/local/lib/R/site-library \ - && chown root:staff /usr/local/lib/R/site-library \ - && chmod g+ws /usr/local/lib/R/site-library \ - ## Fix library path - && sed -i '/^R_LIBS_USER=.*$/d' /usr/local/lib/R/etc/Renviron \ - && echo "R_LIBS_USER=\${R_LIBS_USER-'/usr/local/lib/R/site-library'}" >> /usr/local/lib/R/etc/Renviron \ - && echo "R_LIBS=\${R_LIBS-'/usr/local/lib/R/site-library:/usr/local/lib/R/library:/usr/lib/R/library'}" >> /usr/local/lib/R/etc/Renviron \ - ## Set configured CRAN mirror - && if [ -z "$BUILD_DATE" ]; then MRAN=$CRAN; \ - else MRAN=https://mran.microsoft.com/snapshot/${BUILD_DATE}; fi \ - && echo MRAN=$MRAN >> /etc/environment \ - && echo "options(repos = c(CRAN='$MRAN'), download.file.method = 'libcurl')" >> /usr/local/lib/R/etc/Rprofile.site \ - ## Use littler installation scripts - && Rscript -e "install.packages(c('littler', 'docopt'), repo = '$CRAN')" \ - && ln -s /usr/local/lib/R/site-library/littler/examples/install2.r /usr/local/bin/install2.r \ - && ln -s /usr/local/lib/R/site-library/littler/examples/installGithub.r /usr/local/bin/installGithub.r \ - && ln -s /usr/local/lib/R/site-library/littler/bin/r /usr/local/bin/r \ - ## Clean up from R source install - && cd / \ - && rm -rf /tmp/* \ - && apt-get remove --purge -y $BUILDDEPS \ - && apt-get autoremove -y \ - && apt-get autoclean -y \ - && rm -rf /var/lib/apt/lists/* - -RUN locale-gen en_US.UTF-8 && \ - update-locale LANG=en_US.UTF-8 && \ - update-locale LC_ALL=en_US.UTF-8 && \ - export LANGUAGE=en_US.UTF-8 && \ - export LANG=en_US.UTF-8 && \ - export LC_ALL=en_US.UTF-8 && \ - dpkg-reconfigure locales - -RUN apt update && apt full-upgrade -y && \ - apt install -y links curl vim libcurl4-openssl-dev \ - libxml2-dev libz-dev libpoppler-cpp-dev \ - libopenmpi-dev libzmq3-dev build-essential python3-dev \ - libssl1.1 libssl-dev && \ - apt clean && \ - rm -f /etc/localtime && \ - ln -s /usr/share/zoneinfo/Europe/Vienna /etc/localtime && \ - dpkg --configure -a - -RUN apt-get -y install python3 python3-pip - -RUN apt-get -y install automake -RUN R -e 'options(repos="https://cran.wu.ac.at")' && \ - R -e 'install.packages("remotes")' && \ - R -e 'install.packages("renv", version="0.14.0-5")' - -ENV PYTHONPATH="/headstart/:/headstart/metrics/:/headstart/metrics/src/" + libssl-dev \ + libxml2-dev \ + libz-dev \ + libpoppler-cpp-dev \ + libopenmpi-dev \ + libzmq3-dev \ + libuv1-dev \ + build-essential \ + && locale-gen en_US.UTF-8 \ + && update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 \ + && rm -f /etc/localtime \ + && ln -s /usr/share/zoneinfo/Europe/Vienna /etc/localtime \ + && rm -rf /var/lib/apt/lists/* + +ENV LC_ALL=en_US.UTF-8 \ + LANG=en_US.UTF-8 \ + RENV_PATHS_CACHE=/renv/cache \ + PYTHONPATH="/headstart/:/headstart/metrics/:/headstart/metrics/src/" + +RUN R -e 'install.packages("renv", repos="https://packagemanager.posit.co/cran/latest")' WORKDIR /headstart COPY workers/metrics/requirements.txt . -RUN pip3 install --no-cache-dir Cython -RUN pip3 install --upgrade pip -RUN pip3 install --no-cache-dir -r requirements.txt +RUN pip3 install --break-system-packages --no-cache-dir -r requirements.txt COPY workers/metrics/renv.lock . COPY workers/metrics/activate.R . -RUN apt-get -y install automake RUN R -e 'renv::consent(provided = TRUE)' && \ - R -e 'setwd("./"); renv::activate(); renv::restore(lockfile = "./renv.lock")' + R -e 'setwd("/headstart"); renv::activate(); renv::restore(lockfile = "renv.lock")' COPY workers/common ../common COPY workers/metrics/requirements-e.txt . -RUN pip3 install --no-cache-dir -r requirements-e.txt - +RUN pip3 install --break-system-packages --no-cache-dir -r requirements-e.txt + COPY workers/metrics ./metrics COPY preprocessing/resources ./resources COPY preprocessing/other-scripts ./other-scripts diff --git a/server/workers/metrics/Dockerfile.r b/server/workers/metrics/Dockerfile.r index 04d69801d..0ef31135d 100644 --- a/server/workers/metrics/Dockerfile.r +++ b/server/workers/metrics/Dockerfile.r @@ -1,127 +1,28 @@ -FROM ubuntu:20.04 +FROM rocker/r-ver:4.4.2 LABEL maintainer="Chris Kittel " ENV DEBIAN_FRONTEND=noninteractive -ARG R_VERSION -ARG BUILD_DATE -ARG CRAN -ENV R_VERSION=${R_VERSION:-3.6.3} \ - CRAN=${CRAN:-https://cran.rstudio.com} - RUN apt-get update && apt-get install -y --no-install-recommends \ - bash-completion \ - ca-certificates \ - file \ - fonts-texgyre \ - g++ \ - gfortran \ - gsfonts \ - libblas-dev \ - libbz2-1.0 \ - libcurl4 \ - libjpeg-turbo8-dev \ - libopenblas-dev \ - libpangocairo-1.0-0 \ - libpcre3 \ - libpng16-16 \ - libreadline-dev \ - libtiff5 \ - liblzma5 \ locales \ - make \ - unzip \ - zip \ - zlib1g && \ - \ - BUILDDEPS="curl \ - default-jdk \ - libbz2-dev \ - libcairo2-dev \ - libcurl4-openssl-dev \ - libpango1.0-dev \ - libjpeg-dev \ - libpcre3-dev \ - libpng-dev \ - libreadline-dev \ - libtiff5-dev \ - liblzma-dev \ - libx11-dev \ - libxt-dev \ - perl \ - tcl8.6-dev \ - tk8.6-dev \ - x11proto-core-dev \ - xauth \ - xfonts-base \ - xvfb \ - zlib1g-dev" && \ - apt-get install -y --no-install-recommends $BUILDDEPS - -RUN mkdir -p /tmp/build && cd /tmp/build && \ - curl -O https://cran.r-project.org/src/base/R-3/R-${R_VERSION}.tar.gz && \ - tar -xf R-${R_VERSION}.tar.gz && cd R-${R_VERSION} && \ - R_PAPERSIZE=letter \ - R_BATCHSAVE="--no-save --no-restore" \ - R_BROWSER=xdg-open \ - PAGER=/usr/bin/pager \ - PERL=/usr/bin/perl \ - R_UNZIPCMD=/usr/bin/unzip \ - R_ZIPCMD=/usr/bin/zip \ - R_PRINTCMD=/usr/bin/lpr \ - LIBnn=lib \ - AWK=/usr/bin/awk \ - CFLAGS="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g" \ - CXXFLAGS="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g" \ - ./configure --enable-R-shlib --enable-memory-profiling --with-readline --with-blas --with-tcltk --disable-nls --with-recommended-packages && \ - make && make install && \ - mkdir -p /usr/local/lib/R/site-library && \ - chown root:staff /usr/local/lib/R/site-library && chmod g+ws /usr/local/lib/R/site-library && \ - sed -i '/^R_LIBS_USER=.*$/d' /usr/local/lib/R/etc/Renviron && \ - echo "R_LIBS_USER=\${R_LIBS_USER-'/usr/local/lib/R/site-library'}" >> /usr/local/lib/R/etc/Renviron && \ - echo "R_LIBS=\${R_LIBS-'/usr/local/lib/R/site-library:/usr/local/lib/R/library:/usr/lib/R/library'}" >> /usr/local/lib/R/etc/Renviron && \ - if [ -z "$BUILD_DATE" ]; then MRAN=$CRAN; else MRAN=https://mran.microsoft.com/snapshot/${BUILD_DATE}; fi && \ - echo MRAN=$MRAN >> /etc/environment && \ - echo "options(repos = c(CRAN='$MRAN'), download.file.method = 'libcurl')" >> /usr/local/lib/R/etc/Rprofile.site && \ - Rscript -e "install.packages(c('littler', 'docopt'), repo='$CRAN')" && \ - ln -s /usr/local/lib/R/site-library/littler/examples/install2.r /usr/local/bin/install2.r && \ - ln -s /usr/local/lib/R/site-library/littler/examples/installGithub.r /usr/local/bin/installGithub.r && \ - ln -s /usr/local/lib/R/site-library/littler/bin/r /usr/local/bin/r && \ - cd / && rm -rf /tmp/build && \ - apt-get remove --purge -y $BUILDDEPS && \ - apt-get autoremove -y && \ - apt-get autoclean -y && \ - rm -rf /var/lib/apt/lists/* - -RUN locale-gen en_US.UTF-8 && \ - update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 && \ - dpkg-reconfigure locales - -RUN apt update && apt full-upgrade -y && \ - apt install -y \ - links \ - curl \ - vim \ libcurl4-openssl-dev \ + libssl-dev \ libxml2-dev \ libz-dev \ libpoppler-cpp-dev \ libopenmpi-dev \ libzmq3-dev \ build-essential \ - python3-dev \ - libssl1.1 \ - libssl-dev && \ - apt clean && \ - rm -f /etc/localtime && \ - ln -s /usr/share/zoneinfo/Europe/Vienna /etc/localtime && \ - dpkg --configure -a + && locale-gen en_US.UTF-8 \ + && update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 \ + && rm -rf /var/lib/apt/lists/* + +ENV LC_ALL=en_US.UTF-8 \ + LANG=en_US.UTF-8 \ + RENV_PATHS_CACHE=/renv/cache -RUN apt-get -y install automake && \ - R -e 'options(repos="https://cran.wu.ac.at")' && \ - R -e 'install.packages("remotes")' && \ - R -e 'install.packages("renv", version="0.14.0-5")' +RUN R -e 'install.packages("renv", repos="https://packagemanager.posit.co/cran/latest")' WORKDIR /headstart COPY workers/metrics/renv.lock . @@ -133,4 +34,4 @@ RUN R -e 'renv::consent(provided = TRUE)' && \ COPY workers/metrics/test_r_packages.R /usr/local/bin/test_r_packages.R RUN chmod +x /usr/local/bin/test_r_packages.R -CMD ["R", "--version"] \ No newline at end of file +CMD ["R", "--version"] diff --git a/server/workers/metrics/example_metrics.env b/server/workers/metrics/example_metrics.env index 568972967..08cb11471 100644 --- a/server/workers/metrics/example_metrics.env +++ b/server/workers/metrics/example_metrics.env @@ -1,3 +1,13 @@ +# Crossref Metadata Plus token (optional). +# When set, citation counts use the REST API with higher rate limits +# (header: Crossref-Plus-API-Token: Bearer ) instead of the legacy +# OpenURL API. Obtain your token from https://www.crossref.org/services/metadata-plus/ +R_CROSSREF_PLUS_TOKEN= + +# Number of concurrent async requests per batch when using the Plus path. +# Increase if your Plus tier supports higher concurrency. Default: 50 +R_CROSSREF_BATCH_SIZE=50 + LOGFILE=/var/log/headstart/headstart.log RENV_VERSION=0.14.0-5 CRAN_REPOS=https://cran.wu.ac.at diff --git a/server/workers/metrics/renv.lock b/server/workers/metrics/renv.lock index d3b212761..02439f747 100644 --- a/server/workers/metrics/renv.lock +++ b/server/workers/metrics/renv.lock @@ -1,6 +1,6 @@ { "R": { - "Version": "3.6.3", + "Version": "4.4.2", "Repositories": [ { "Name": "CRAN", @@ -11,549 +11,3163 @@ "Packages": { "DT": { "Package": "DT", - "Version": "0.33", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "64ff3427f559ce3f2597a4fe13255cb6" + "Version": "0.34.0", + "Source": "Repository", + "Type": "Package", + "Title": "A Wrapper of the JavaScript Library 'DataTables'", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Xianying\", \"Tan\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"JJ\", \"Allaire\", role = \"ctb\"), person(\"Maximilian\", \"Girlich\", role = \"ctb\"), person(\"Greg\", \"Freedman Ellis\", role = \"ctb\"), person(\"Johannes\", \"Rauh\", role = \"ctb\"), person(\"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables in htmlwidgets/lib\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js in htmlwidgets/lib\"), person(\"Leon\", \"Gersen\", role = c(\"ctb\", \"cph\"), comment = \"noUiSlider in htmlwidgets/lib\"), person(\"Bartek\", \"Szopka\", role = c(\"ctb\", \"cph\"), comment = \"jquery.highlight.js in htmlwidgets/lib\"), person(\"Alex\", \"Pickering\", role = \"ctb\"), person(\"William\", \"Holmes\", role = \"ctb\"), person(\"Mikko\", \"Marttila\", role = \"ctb\"), person(\"Andres\", \"Quintero\", role = \"ctb\"), person(\"St\u00e9phane\", \"Laurent\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Data objects in R can be rendered as HTML tables using the JavaScript library 'DataTables' (typically via R Markdown or Shiny). The 'DataTables' library has been included in this R package. The package name 'DT' is an abbreviation of 'DataTables'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/DT", + "BugReports": "https://github.com/rstudio/DT/issues", + "Imports": [ + "crosstalk", + "htmltools (>= 0.3.6)", + "htmlwidgets (>= 1.3)", + "jquerylib", + "jsonlite (>= 0.9.16)", + "magrittr", + "promises" + ], + "Suggests": [ + "bslib", + "future", + "httpuv", + "knitr (>= 1.8)", + "rmarkdown", + "shiny (>= 1.6)", + "testit", + "tibble" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut], Joe Cheng [aut], Xianying Tan [aut], Garrick Aden-Buie [aut, cre] (ORCID: ), JJ Allaire [ctb], Maximilian Girlich [ctb], Greg Freedman Ellis [ctb], Johannes Rauh [ctb], SpryMedia Limited [ctb, cph] (DataTables in htmlwidgets/lib), Brian Reavis [ctb, cph] (selectize.js in htmlwidgets/lib), Leon Gersen [ctb, cph] (noUiSlider in htmlwidgets/lib), Bartek Szopka [ctb, cph] (jquery.highlight.js in htmlwidgets/lib), Alex Pickering [ctb], William Holmes [ctb], Mikko Marttila [ctb], Andres Quintero [ctb], St\u00e9phane Laurent [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Garrick Aden-Buie ", + "Repository": "CRAN" + }, + "KernSmooth": { + "Package": "KernSmooth", + "Version": "2.23-24", + "Source": "Repository", + "Priority": "recommended", + "Date": "2024-05-16", + "Title": "Functions for Kernel Smoothing Supporting Wand & Jones (1995)", + "Authors@R": "c(person(\"Matt\", \"Wand\", role = \"aut\", email = \"Matt.Wand@uts.edu.au\"), person(\"Cleve\", \"Moler\", role = \"ctb\", comment = \"LINPACK routines in src/d*\"), person(\"Brian\", \"Ripley\", role = c(\"trl\", \"cre\", \"ctb\"), email = \"ripley@stats.ox.ac.uk\", comment = \"R port and updates\"))", + "Note": "Maintainers are not available to give advice on using a package they did not author.", + "Depends": [ + "R (>= 2.5.0)", + "stats" + ], + "Suggests": [ + "MASS", + "carData" + ], + "Description": "Functions for kernel smoothing (and density estimation) corresponding to the book: Wand, M.P. and Jones, M.C. (1995) \"Kernel Smoothing\".", + "License": "Unlimited", + "ByteCompile": "yes", + "NeedsCompilation": "yes", + "Author": "Matt Wand [aut], Cleve Moler [ctb] (LINPACK routines in src/d*), Brian Ripley [trl, cre, ctb] (R port and updates)", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" + }, + "MASS": { + "Package": "MASS", + "Version": "7.3-61", + "Source": "Repository", + "Priority": "recommended", + "Date": "2024-06-10", + "Revision": "$Rev: 3657 $", + "Depends": [ + "R (>= 4.4.0)", + "grDevices", + "graphics", + "stats", + "utils" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "lattice", + "nlme", + "nnet", + "survival" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"ripley@stats.ox.ac.uk\"), person(\"Bill\", \"Venables\", role = c(\"aut\", \"cph\")), person(c(\"Douglas\", \"M.\"), \"Bates\", role = \"ctb\"), person(\"Kurt\", \"Hornik\", role = \"trl\", comment = \"partial port ca 1998\"), person(\"Albrecht\", \"Gebhardt\", role = \"trl\", comment = \"partial port ca 1998\"), person(\"David\", \"Firth\", role = \"ctb\", comment = \"support functions for polr\"))", + "Description": "Functions and datasets to support Venables and Ripley, \"Modern Applied Statistics with S\" (4th edition, 2002).", + "Title": "Support Functions and Datasets for Venables and Ripley's MASS", + "LazyData": "yes", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "Contact": "", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], Bill Venables [aut, cph], Douglas M. Bates [ctb], Kurt Hornik [trl] (partial port ca 1998), Albrecht Gebhardt [trl] (partial port ca 1998), David Firth [ctb] (support functions for polr)", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" + }, + "Matrix": { + "Package": "Matrix", + "Version": "1.7-1", + "Source": "Repository", + "VersionNote": "do also bump src/version.h, inst/include/Matrix/version.h", + "Date": "2024-10-17", + "Priority": "recommended", + "Title": "Sparse and Dense Matrix Classes and Methods", + "Description": "A rich hierarchy of sparse and dense matrix classes, including general, symmetric, triangular, and diagonal matrices with numeric, logical, or pattern entries. Efficient methods for operating on such matrices, often wrapping the 'BLAS', 'LAPACK', and 'SuiteSparse' libraries.", + "License": "GPL (>= 2) | file LICENCE", + "URL": "https://Matrix.R-forge.R-project.org", + "BugReports": "https://R-forge.R-project.org/tracker/?atid=294&group_id=61", + "Contact": "Matrix-authors@R-project.org", + "Authors@R": "c(person(\"Douglas\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"Martin\", \"Maechler\", role = c(\"aut\", \"cre\"), email = \"mmaechler+Matrix@gmail.com\", comment = c(ORCID = \"0000-0002-8685-9910\")), person(\"Mikael\", \"Jagan\", role = \"aut\", comment = c(ORCID = \"0000-0002-3542-2938\")), person(\"Timothy A.\", \"Davis\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7614-6899\", \"SuiteSparse libraries\", \"collaborators listed in dir(system.file(\\\"doc\\\", \\\"SuiteSparse\\\", package=\\\"Matrix\\\"), pattern=\\\"License\\\", full.names=TRUE, recursive=TRUE)\")), person(\"George\", \"Karypis\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2753-1437\", \"METIS library\", \"Copyright: Regents of the University of Minnesota\")), person(\"Jason\", \"Riedy\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4345-4200\", \"GNU Octave's condest() and onenormest()\", \"Copyright: Regents of the University of California\")), person(\"Jens\", \"Oehlschl\u00e4gel\", role = \"ctb\", comment = \"initial nearPD()\"), person(\"R Core Team\", role = \"ctb\", comment = \"base R's matrix implementation\"))", + "Depends": [ + "R (>= 4.4.0)", + "methods" + ], + "Imports": [ + "grDevices", + "graphics", + "grid", + "lattice", + "stats", + "utils" + ], + "Suggests": [ + "MASS", + "datasets", + "sfsmisc", + "tools" + ], + "Enhances": [ + "SparseM", + "graph" + ], + "LazyData": "no", + "LazyDataNote": "not possible, since we use data/*.R and our S4 classes", + "BuildResaveData": "no", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Douglas Bates [aut] (), Martin Maechler [aut, cre] (), Mikael Jagan [aut] (), Timothy A. Davis [ctb] (, SuiteSparse libraries, collaborators listed in dir(system.file(\"doc\", \"SuiteSparse\", package=\"Matrix\"), pattern=\"License\", full.names=TRUE, recursive=TRUE)), George Karypis [ctb] (, METIS library, Copyright: Regents of the University of Minnesota), Jason Riedy [ctb] (, GNU Octave's condest() and onenormest(), Copyright: Regents of the University of California), Jens Oehlschl\u00e4gel [ctb] (initial nearPD()), R Core Team [ctb] (base R's matrix implementation)", + "Maintainer": "Martin Maechler ", + "Repository": "CRAN" }, "R6": { "Package": "R6", - "Version": "2.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "470851b6d5d0ac559e9d01bb352b4021" + "Version": "2.6.1", + "Source": "Repository", + "Title": "Encapsulated Classes with Reference Semantics", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Creates classes with reference semantics, similar to R's built-in reference classes. Compared to reference classes, R6 classes are simpler and lighter-weight, and they are not built on S4 classes so they do not require the methods package. These classes allow public and private members, and they support inheritance, even when the classes are defined in different packages.", + "License": "MIT + file LICENSE", + "URL": "https://r6.r-lib.org, https://github.com/r-lib/R6", + "BugReports": "https://github.com/r-lib/R6/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Suggests": [ + "lobstr", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate, ggplot2, microbenchmark, scales", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "Rcpp": { "Package": "Rcpp", - "Version": "1.0.13", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "f27411eb6d9c3dada5edd444b8416675" + "Version": "1.1.1-1.1", + "Source": "Repository", + "Title": "Seamless R and C++ Integration", + "Date": "2026-04-19", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"JJ\", \"Allaire\", role = \"aut\", comment = c(ORCID = \"0000-0003-0174-9868\")), person(\"Kevin\", \"Ushey\", role = \"aut\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Qiang\", \"Kou\", role = \"aut\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Nathan\", \"Russell\", role = \"aut\"), person(\"I\u00f1aki\", \"Ucar\", role = \"aut\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"John\", \"Chambers\", role = \"aut\"))", + "Description": "The 'Rcpp' package provides R functions as well as C++ classes which offer a seamless integration of R and C++. Many R data types and objects can be mapped back and forth to C++ equivalents which facilitates both writing of new code as well as easier integration of third-party libraries. Documentation about 'Rcpp' is provided by several vignettes included in this package, via the 'Rcpp Gallery' site at , the paper by Eddelbuettel and Francois (2011, ), the book by Eddelbuettel (2013, ) and the paper by Eddelbuettel and Balamuta (2018, ); see 'citation(\"Rcpp\")' for details.", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "methods", + "utils" + ], + "Suggests": [ + "tinytest", + "inline", + "rbenchmark", + "pkgKitten (>= 0.1.2)" + ], + "URL": "https://www.rcpp.org, https://dirk.eddelbuettel.com/code/rcpp.html, https://github.com/RcppCore/Rcpp", + "License": "GPL (>= 2)", + "BugReports": "https://github.com/RcppCore/Rcpp/issues", + "MailingList": "rcpp-devel@lists.r-forge.r-project.org", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "VignetteBuilder": "Rcpp", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Romain Francois [aut] (ORCID: ), JJ Allaire [aut] (ORCID: ), Kevin Ushey [aut] (ORCID: ), Qiang Kou [aut] (ORCID: ), Nathan Russell [aut], I\u00f1aki Ucar [aut] (ORCID: ), Doug Bates [aut] (ORCID: ), John Chambers [aut]", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" }, "XML": { "Package": "XML", - "Version": "3.98-1.20", - "Source": "URL", - "Repository": "CRAN", - "RemoteType": "url", - "RemoteUrl": "https://cran.r-project.org/src/contrib/Archive/XML/XML_3.98-1.20.tar.gz", - "Hash": "9de1032729115c474bd8a49838f46731" + "Version": "3.99-0.23", + "Source": "Repository", + "Authors@R": "c(person(\"CRAN Team\", role = \"ctb\", email = \"CRAN@r-project.org\", comment = \"de facto maintainer in 2013-2026\"), person(\"Duncan\", \"Temple Lang\", role = \"aut\", email = \"duncan@r-project.org\", comment = c(ORCID = \"0000-0003-0159-1546\")), person(\"Tomas\", \"Kalibera\", role = \"ctb\"), person(\"Ivan\", \"Krylov\", email = \"ikrylov@disroot.org\", role = \"cre\"))", + "Title": "Tools for Parsing and Generating XML Within R and S-Plus", + "Depends": [ + "R (>= 4.0.0)", + "methods", + "utils" + ], + "Suggests": [ + "bitops", + "RCurl" + ], + "SystemRequirements": "libxml2 (>= 2.6.3)", + "Description": "Many approaches for both reading and creating XML (and HTML) documents (including DTDs), both local and accessible via HTTP or FTP. Also offers access to an 'XPath' \"interpreter\".", + "BugReports": "https://codeberg.org/aitap/XML/issues", + "License": "BSD_3_clause + file LICENSE", + "Collate": "AAA.R DTD.R DTDClasses.R DTDRef.R SAXMethods.R XMLClasses.R applyDOM.R assignChild.R catalog.R createNode.R dynSupports.R error.R flatTree.R nodeAccessors.R parseDTD.R schema.R summary.R tangle.R toString.R tree.R version.R xmlErrorEnums.R xmlEventHandler.R xmlEventParse.R xmlHandler.R xmlInternalSource.R xmlOutputDOM.R xmlNodes.R xmlOutputBuffer.R xmlTree.R xmlTreeParse.R htmlParse.R hashTree.R zzz.R supports.R parser.R libxmlFeatures.R xmlString.R saveXML.R namespaces.R readHTMLTable.R reflection.R xmlToDataFrame.R bitList.R compare.R encoding.R fixNS.R xmlRoot.R serialize.R xmlMemoryMgmt.R keyValueDB.R solrDocs.R XMLRErrorInfo.R xincludes.R namespaceHandlers.R tangle1.R htmlLinks.R htmlLists.R getDependencies.R getRelativeURL.R xmlIncludes.R simplifyPath.R", + "NeedsCompilation": "yes", + "Author": "CRAN Team [ctb] (de facto maintainer in 2013-2026), Duncan Temple Lang [aut] (ORCID: ), Tomas Kalibera [ctb], Ivan Krylov [cre]", + "Maintainer": "Ivan Krylov ", + "Repository": "CRAN" }, "askpass": { "Package": "askpass", - "Version": "1.2.0", + "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "cad6cf7f1d5f6e906700b9d3e718c796" + "Type": "Package", + "Title": "Password Entry Utilities for R, Git, and SSH", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Cross-platform utilities for prompting the user for credentials or a passphrase, for example to authenticate with a server or read a protected key. Includes native programs for MacOS and Windows, hence no 'tcltk' is required. Password entry can be invoked in two different ways: directly from R via the askpass() function, or indirectly as password-entry back-end for 'ssh-agent' or 'git-credential' via the SSH_ASKPASS and GIT_ASKPASS environment variables. Thereby the user can be prompted for credentials or a passphrase if needed when R calls out to git or ssh.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.r-universe.dev/askpass", + "BugReports": "https://github.com/r-lib/askpass/issues", + "Encoding": "UTF-8", + "Imports": [ + "sys (>= 2.1)" + ], + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] ()", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "base64enc": { "Package": "base64enc", - "Version": "0.1-3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "543776ae6848fde2f48ff3816d0628bc" + "Version": "0.1-6", + "Source": "Repository", + "Title": "Tools for 'base64' Encoding", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.nz, ORCID: )", + "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.nz\", ORCID=\"0000-0003-2297-1732\"))", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" + ], + "Enhances": [ + "png" + ], + "Description": "Tools for handling 'base64' encoding. It is more flexible than the orphaned 'base64' package.", + "License": "GPL-2 | GPL-3", + "URL": "https://www.rforge.net/base64enc", + "BugReports": "https://github.com/s-u/base64enc/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, + "boot": { + "Package": "boot", + "Version": "1.3-31", + "Source": "Repository", + "Priority": "recommended", + "Date": "2024-08-28", + "Authors@R": "c(person(\"Angelo\", \"Canty\", role = \"aut\", email = \"cantya@mcmaster.ca\", comment = \"author of original code for S\"), person(\"Brian\", \"Ripley\", role = c(\"aut\", \"trl\"), email = \"ripley@stats.ox.ac.uk\", comment = \"conversion to R, maintainer 1999--2022, author of parallel support\"), person(\"Alessandra R.\", \"Brazzale\", role = c(\"ctb\", \"cre\"), email = \"brazzale@stat.unipd.it\", comment = \"minor bug fixes\"))", + "Maintainer": "Alessandra R. Brazzale ", + "Note": "Maintainers are not available to give advice on using a package they did not author.", + "Description": "Functions and datasets for bootstrapping from the book \"Bootstrap Methods and Their Application\" by A. C. Davison and D. V. Hinkley (1997, CUP), originally written by Angelo Canty for S.", + "Title": "Bootstrap Functions (Originally by Angelo Canty for S)", + "Depends": [ + "R (>= 3.0.0)", + "graphics", + "stats" + ], + "Suggests": [ + "MASS", + "survival" + ], + "LazyData": "yes", + "ByteCompile": "yes", + "License": "Unlimited", + "NeedsCompilation": "no", + "Author": "Angelo Canty [aut] (author of original code for S), Brian Ripley [aut, trl] (conversion to R, maintainer 1999--2022, author of parallel support), Alessandra R. Brazzale [ctb, cre] (minor bug fixes)", + "Repository": "CRAN" }, "bslib": { "Package": "bslib", - "Version": "0.8.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "b299c6741ca9746fb227debcb0f9fb6c" + "Version": "0.11.0", + "Source": "Repository", + "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'", + "Authors@R": "c( person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap colorpicker library\"), person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"), comment = \"Bootswatch library\"), person(, \"PayPal\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap accessibility plugin\") )", + "Description": "Simplifies custom 'CSS' styling of both 'shiny' and 'rmarkdown' via 'Bootstrap' 'Sass'. Supports 'Bootstrap' 3, 4 and 5 as well as their various 'Bootswatch' themes. An interactive widget is also provided for previewing themes in real time.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/bslib/, https://github.com/rstudio/bslib", + "BugReports": "https://github.com/rstudio/bslib/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ + "base64enc", + "cachem", + "fastmap (>= 1.1.1)", + "grDevices", + "htmltools (>= 0.5.8)", + "jquerylib (>= 0.1.3)", + "jsonlite", + "lifecycle", + "memoise (>= 2.0.1)", + "mime", + "rlang", + "sass (>= 0.4.9)" + ], + "Suggests": [ + "brand.yml", + "bsicons", + "curl", + "fontawesome", + "future", + "ggplot2", + "knitr", + "lattice", + "magrittr", + "rappdirs", + "rmarkdown (>= 2.7)", + "shiny (>= 1.11.1.9000)", + "testthat", + "thematic", + "tools", + "utils", + "withr", + "yaml" + ], + "Config/Needs/deploy": "BH, chiflights22, colourpicker, commonmark, cpp11, cpsievert/chiflights22, cpsievert/histoslider, dplyr, DT, ggplot2, ggridges, gt, hexbin, histoslider, htmlwidgets, lattice, leaflet, lubridate, markdown, modelr, plotly, reactable, reshape2, rprojroot, rsconnect, rstudio/shiny, scales, styler, tibble", + "Config/Needs/routine": "chromote, desc, renv", + "Config/Needs/website": "brio, crosstalk, dplyr, DT, ggplot2, glue, htmlwidgets, leaflet, lorem, palmerpenguins, plotly, purrr, rprojroot, rstudio/htmltools, scales, stringr, tidyr, webshot2", + "Config/roxygen2/version": "8.0.0", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*", + "Encoding": "UTF-8", + "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-code-editor.R' 'input-dark-mode.R' 'input-submit.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'toast.R' 'toolbar.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (ORCID: ), Joe Cheng [aut], Garrick Aden-Buie [aut] (ORCID: ), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "cachem": { "Package": "cachem", "Version": "1.1.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "cd9a672193789068eb5a2aad65a0dedf" + "Title": "Cache R Objects with Automatic Pruning", + "Description": "Key-value stores with automatic pruning. Caches can limit either their total size or the age of the oldest object (or both), automatically pruning objects to maintain the constraints.", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", c(\"aut\", \"cre\")), person(family = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")))", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "ByteCompile": "true", + "URL": "https://cachem.r-lib.org/, https://github.com/r-lib/cachem", + "Imports": [ + "rlang", + "fastmap (>= 1.2.0)" + ], + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.2.3", + "Config/Needs/routine": "lobstr", + "Config/Needs/website": "pkgdown", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "class": { + "Package": "class", + "Version": "7.3-22", + "Source": "Repository", + "Priority": "recommended", + "Date": "2023-05-02", + "Depends": [ + "R (>= 3.0.0)", + "stats", + "utils" + ], + "Imports": [ + "MASS" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"ripley@stats.ox.ac.uk\"), person(\"William\", \"Venables\", role = \"cph\"))", + "Description": "Various functions for classification, including k-nearest neighbour, Learning Vector Quantization and Self-Organizing Maps.", + "Title": "Functions for Classification", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], William Venables [cph]", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "cli": { "Package": "cli", - "Version": "3.6.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "b21916dd77a27642b447374a5d30ecf3" + "Version": "3.6.6", + "Source": "Repository", + "Title": "Helpers for Developing Command Line Interfaces", + "Authors@R": "c( person(\"G\u00e1bor\", \"Cs\u00e1rdi\", , \"gabor@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Kirill\", \"M\u00fcller\", role = \"ctb\"), person(\"Salim\", \"Br\u00fcggemann\", , \"salim-b@pm.me\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A suite of tools to build attractive command line interfaces ('CLIs'), from semantic elements: headings, lists, alerts, paragraphs, etc. Supports custom themes via a 'CSS'-like language. It also contains a number of lower level 'CLI' elements: rules, boxes, trees, and 'Unicode' symbols with 'ASCII' alternatives. It support ANSI colors and text styles as well.", + "License": "MIT + file LICENSE", + "URL": "https://cli.r-lib.org, https://github.com/r-lib/cli", + "BugReports": "https://github.com/r-lib/cli/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "utils" + ], + "Suggests": [ + "callr", + "covr", + "crayon", + "digest", + "glue (>= 1.6.0)", + "grDevices", + "htmltools", + "htmlwidgets", + "knitr", + "methods", + "processx", + "ps (>= 1.3.4.9000)", + "rlang (>= 1.0.2.9003)", + "rmarkdown", + "rprojroot", + "rstudioapi", + "testthat (>= 3.2.0)", + "tibble", + "whoami", + "withr" + ], + "Config/Needs/website": "r-lib/asciicast, bench, brio, cpp11, decor, desc, fansi, prettyunits, sessioninfo, tidyverse/tidytemplate, usethis, vctrs", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "yes", + "Author": "G\u00e1bor Cs\u00e1rdi [aut, cre], Hadley Wickham [ctb], Kirill M\u00fcller [ctb], Salim Br\u00fcggemann [ctb] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "G\u00e1bor Cs\u00e1rdi ", + "Repository": "CRAN" + }, + "cluster": { + "Package": "cluster", + "Version": "2.1.6", + "Source": "Repository", + "Date": "2023-11-30", + "Priority": "recommended", + "Title": "\"Finding Groups in Data\": Cluster Analysis Extended Rousseeuw et al.", + "Description": "Methods for Cluster analysis. Much extended the original from Peter Rousseeuw, Anja Struyf and Mia Hubert, based on Kaufman and Rousseeuw (1990) \"Finding Groups in Data\".", + "Maintainer": "Martin Maechler ", + "Authors@R": "c(person(\"Martin\",\"Maechler\", role = c(\"aut\",\"cre\"), email=\"maechler@stat.math.ethz.ch\", comment = c(ORCID = \"0000-0002-8685-9910\")) ,person(\"Peter\", \"Rousseeuw\", role=\"aut\", email=\"peter.rousseeuw@kuleuven.be\", comment = c(\"Fortran original\", ORCID = \"0000-0002-3807-5353\")) ,person(\"Anja\", \"Struyf\", role=\"aut\", comment= \"S original\") ,person(\"Mia\", \"Hubert\", role=\"aut\", email= \"Mia.Hubert@uia.ua.ac.be\", comment = c(\"S original\", ORCID = \"0000-0001-6398-4850\")) ,person(\"Kurt\", \"Hornik\", role=c(\"trl\", \"ctb\"), email=\"Kurt.Hornik@R-project.org\", comment=c(\"port to R; maintenance(1999-2000)\", ORCID=\"0000-0003-4198-9911\")) ,person(\"Matthias\", \"Studer\", role=\"ctb\") ,person(\"Pierre\", \"Roudier\", role=\"ctb\") ,person(\"Juan\", \"Gonzalez\", role=\"ctb\") ,person(\"Kamil\", \"Kozlowski\", role=\"ctb\") ,person(\"Erich\", \"Schubert\", role=\"ctb\", comment = c(\"fastpam options for pam()\", ORCID = \"0000-0001-9143-4880\")) ,person(\"Keefe\", \"Murphy\", role=\"ctb\", comment = \"volume.ellipsoid({d >= 3})\") #not yet ,person(\"Fischer-Rasmussen\", \"Kasper\", role = \"ctb\", comment = \"Gower distance for CLARA\") )", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "graphics", + "grDevices", + "stats", + "utils" + ], + "Suggests": [ + "MASS", + "Matrix" + ], + "SuggestsNote": "MASS: two examples using cov.rob() and mvrnorm(); Matrix tools for testing", + "Enhances": [ + "mvoutlier", + "fpc", + "ellipse", + "sfsmisc" + ], + "EnhancesNote": "xref-ed in man/*.Rd", + "LazyLoad": "yes", + "LazyData": "yes", + "ByteCompile": "yes", + "BuildResaveData": "no", + "License": "GPL (>= 2)", + "URL": "https://svn.r-project.org/R-packages/trunk/cluster/", + "NeedsCompilation": "yes", + "Author": "Martin Maechler [aut, cre] (), Peter Rousseeuw [aut] (Fortran original, ), Anja Struyf [aut] (S original), Mia Hubert [aut] (S original, ), Kurt Hornik [trl, ctb] (port to R; maintenance(1999-2000), ), Matthias Studer [ctb], Pierre Roudier [ctb], Juan Gonzalez [ctb], Kamil Kozlowski [ctb], Erich Schubert [ctb] (fastpam options for pam(), ), Keefe Murphy [ctb] (volume.ellipsoid({d >= 3}))", + "Repository": "CRAN" }, "codetools": { "Package": "codetools", - "Version": "0.2-16", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "89cf4b8207269ccf82fbeb6473fd662b" + "Version": "0.2-20", + "Source": "Repository", + "Priority": "recommended", + "Author": "Luke Tierney ", + "Description": "Code analysis tools for R.", + "Title": "Code Analysis Tools for R", + "Depends": [ + "R (>= 2.1)" + ], + "Maintainer": "Luke Tierney ", + "URL": "https://gitlab.com/luke-tierney/codetools", + "License": "GPL", + "NeedsCompilation": "no", + "Repository": "CRAN" }, "commonmark": { "Package": "commonmark", - "Version": "1.9.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "5d8225445acb167abf7797de48b2ee3c" - }, - "crayon": { - "Package": "crayon", - "Version": "1.5.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "859d96e65ef198fd43e82b9628d593ef" + "Version": "2.0.0", + "Source": "Repository", + "Type": "Package", + "Title": "High Performance CommonMark and Github Markdown Rendering in R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", ,\"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"John MacFarlane\", role = \"cph\", comment = \"Author of cmark\"))", + "Description": "The CommonMark specification defines a rationalized version of markdown syntax. This package uses the 'cmark' reference implementation for converting markdown text into various formats including html, latex and groff man. In addition it exposes the markdown parse tree in xml format. Also includes opt-in support for GFM extensions including tables, autolinks, and strikethrough text.", + "License": "BSD_2_clause + file LICENSE", + "URL": "https://docs.ropensci.org/commonmark/ https://ropensci.r-universe.dev/commonmark", + "BugReports": "https://github.com/r-lib/commonmark/issues", + "Suggests": [ + "curl", + "testthat", + "xml2" + ], + "RoxygenNote": "7.3.2", + "Language": "en-US", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), John MacFarlane [cph] (Author of cmark)", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "crosstalk": { "Package": "crosstalk", - "Version": "1.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ab12c7b080a57475248a30f4db6298c0" + "Version": "1.2.2", + "Source": "Repository", + "Type": "Package", + "Title": "Inter-Widget Interactivity for HTML Widgets", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Kristopher Michael\", \"Kowal\", role = c(\"ctb\", \"cph\"), comment = \"es5-shim library\"), person(, \"es5-shim contributors\", role = c(\"ctb\", \"cph\"), comment = \"es5-shim library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\") )", + "Description": "Provides building blocks for allowing HTML widgets to communicate with each other, with Shiny or without (i.e. static .html files). Currently supports linked brushing and filtering.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/crosstalk/, https://github.com/rstudio/crosstalk", + "BugReports": "https://github.com/rstudio/crosstalk/issues", + "Imports": [ + "htmltools (>= 0.3.6)", + "jsonlite", + "lazyeval", + "R6" + ], + "Suggests": [ + "bslib", + "ggplot2", + "sass", + "shiny", + "testthat (>= 2.1.0)" + ], + "Config/Needs/website": "jcheng5/d3scatter, DT, leaflet, rmarkdown", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Brian Reavis [ctb, cph] (selectize.js library), Kristopher Michael Kowal [ctb, cph] (es5-shim library), es5-shim contributors [ctb, cph] (es5-shim library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "crul": { "Package": "crul", - "Version": "1.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "22e70c5046981d39b7bf7af74433e396" + "Version": "1.6.0", + "Source": "Repository", + "Title": "HTTP Client", + "Description": "A simple HTTP client, with tools for making HTTP requests, and mocking HTTP requests. The package is built on R6, and takes inspiration from Ruby's 'faraday' gem (). The package name is a play on curl, the widely used command line tool for HTTP, and this package is built on top of the R package 'curl', an interface to 'libcurl' ().", + "License": "MIT + file LICENSE", + "Authors@R": "c( person(\"Scott\", \"Chamberlain\", role = c(\"aut\", \"cre\"), email = \"myrmecocystus@gmail.com\", comment = c(ORCID = \"0000-0003-1444-9135\")) )", + "URL": "https://docs.ropensci.org/crul/, https://github.com/ropensci/crul, https://books.ropensci.org/http-testing/", + "BugReports": "https://github.com/ropensci/crul/issues", + "Encoding": "UTF-8", + "Language": "en-US", + "Imports": [ + "curl (>= 3.3)", + "R6 (>= 2.2.0)", + "urltools (>= 1.6.0)", + "httpcode (>= 0.2.0)", + "jsonlite", + "mime", + "rlang", + "lifecycle" + ], + "Suggests": [ + "testthat (>= 3.0.0)", + "roxygen2 (>= 7.1.1)", + "fauxpas (>= 0.1.0)", + "webmockr (>= 2.2.0)", + "withr", + "knitr", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "X-schema.org-applicationCategory": "Web", + "X-schema.org-keywords": "http, https, API, web-services, curl, download, libcurl, async, mocking, caching", + "X-schema.org-isPartOf": "https://ropensci.org", + "NeedsCompilation": "no", + "Author": "Scott Chamberlain [aut, cre] (ORCID: )", + "Maintainer": "Scott Chamberlain ", + "Repository": "CRAN" }, "curl": { "Package": "curl", - "Version": "5.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "411ca2c03b1ce5f548345d2fc2685f7a" + "Version": "7.1.0", + "Source": "Repository", + "Type": "Package", + "Title": "A Modern and Flexible Web Client for R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Posit Software, PBC\", role = \"cph\"))", + "Description": "Bindings to 'libcurl' for performing fully configurable HTTP/FTP requests where responses can be processed in memory, on disk, or streaming via the callback or connection interfaces. Some knowledge of 'libcurl' is recommended; for a more-user-friendly web client see the 'httr2' package which builds on this package with http specific tools and logic.", + "License": "MIT + file LICENSE", + "SystemRequirements": "libcurl (>= 7.73): libcurl-devel (rpm) or libcurl4-openssl-dev (deb)", + "URL": "https://jeroen.r-universe.dev/curl", + "BugReports": "https://github.com/jeroen/curl/issues", + "Suggests": [ + "spelling", + "testthat (>= 1.0.0)", + "knitr", + "jsonlite", + "later", + "rmarkdown", + "httpuv (>= 1.4.4)", + "webutils" + ], + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 3.0.0)" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Hadley Wickham [ctb], Posit Software, PBC [cph]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "data.table": { "Package": "data.table", - "Version": "1.15.4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "8ee9ac56ef633d0c7cab8b2ca87d683e" + "Version": "1.18.4", + "Source": "Repository", + "Title": "Extension of `data.frame`", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "bit64 (>= 4.0.0)", + "bit (>= 4.0.4)", + "R.utils (>= 2.13.0)", + "xts", + "zoo (>= 1.8-1)", + "yaml", + "knitr", + "markdown" + ], + "Description": "Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, fast add/modify/delete of columns by group using no copies at all, list columns, friendly and fast character-separated-value read/write. Offers a natural and flexible syntax, for faster development.", + "License": "MPL-2.0 | file LICENSE", + "URL": "https://r-datatable.com, https://Rdatatable.gitlab.io/data.table, https://github.com/Rdatatable/data.table", + "BugReports": "https://github.com/Rdatatable/data.table/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "ByteCompile": "TRUE", + "Authors@R": "c( person(\"Tyson\",\"Barrett\", role=c(\"aut\",\"cre\"), email=\"t.barrett88@gmail.com\", comment = c(ORCID=\"0000-0002-2137-1391\")), person(\"Matt\",\"Dowle\", role=\"aut\", email=\"mattjdowle@gmail.com\"), person(\"Arun\",\"Srinivasan\", role=\"aut\", email=\"asrini@pm.me\"), person(\"Jan\",\"Gorecki\", role=\"aut\", email=\"j.gorecki@wit.edu.pl\"), person(\"Michael\",\"Chirico\", role=\"aut\", email=\"michaelchirico4@gmail.com\", comment = c(ORCID=\"0000-0003-0787-087X\")), person(\"Toby\",\"Hocking\", role=\"aut\", email=\"toby.hocking@r-project.org\", comment = c(ORCID=\"0000-0002-3146-0865\")), person(\"Benjamin\",\"Schwendinger\",role=\"aut\", comment = c(ORCID=\"0000-0003-3315-8114\")), person(\"Ivan\", \"Krylov\", role=\"aut\", email=\"ikrylov@disroot.org\", comment = c(ORCID=\"0000-0002-0172-3812\")), person(\"Pasha\",\"Stetsenko\", role=\"ctb\"), person(\"Tom\",\"Short\", role=\"ctb\"), person(\"Steve\",\"Lianoglou\", role=\"ctb\"), person(\"Eduard\",\"Antonyan\", role=\"ctb\"), person(\"Markus\",\"Bonsch\", role=\"ctb\"), person(\"Hugh\",\"Parsonage\", role=\"ctb\"), person(\"Scott\",\"Ritchie\", role=\"ctb\"), person(\"Kun\",\"Ren\", role=\"ctb\"), person(\"Xianying\",\"Tan\", role=\"ctb\"), person(\"Rick\",\"Saporta\", role=\"ctb\"), person(\"Otto\",\"Seiskari\", role=\"ctb\"), person(\"Xianghui\",\"Dong\", role=\"ctb\"), person(\"Michel\",\"Lang\", role=\"ctb\"), person(\"Watal\",\"Iwasaki\", role=\"ctb\"), person(\"Seth\",\"Wenchel\", role=\"ctb\"), person(\"Karl\",\"Broman\", role=\"ctb\"), person(\"Tobias\",\"Schmidt\", role=\"ctb\"), person(\"David\",\"Arenburg\", role=\"ctb\"), person(\"Ethan\",\"Smith\", role=\"ctb\"), person(\"Francois\",\"Cocquemas\", role=\"ctb\"), person(\"Matthieu\",\"Gomez\", role=\"ctb\"), person(\"Philippe\",\"Chataignon\", role=\"ctb\"), person(\"Nello\",\"Blaser\", role=\"ctb\"), person(\"Dmitry\",\"Selivanov\", role=\"ctb\"), person(\"Andrey\",\"Riabushenko\", role=\"ctb\"), person(\"Cheng\",\"Lee\", role=\"ctb\"), person(\"Declan\",\"Groves\", role=\"ctb\"), person(\"Daniel\",\"Possenriede\", role=\"ctb\"), person(\"Felipe\",\"Parages\", role=\"ctb\"), person(\"Denes\",\"Toth\", role=\"ctb\"), person(\"Mus\",\"Yaramaz-David\", role=\"ctb\"), person(\"Ayappan\",\"Perumal\", role=\"ctb\"), person(\"James\",\"Sams\", role=\"ctb\"), person(\"Martin\",\"Morgan\", role=\"ctb\"), person(\"Michael\",\"Quinn\", role=\"ctb\"), person(given=\"@javrucebo\", role=\"ctb\", comment=\"GitHub user\"), person(\"Marc\",\"Halperin\", role=\"ctb\"), person(\"Roy\",\"Storey\", role=\"ctb\"), person(\"Manish\",\"Saraswat\", role=\"ctb\"), person(\"Morgan\",\"Jacob\", role=\"ctb\"), person(\"Michael\",\"Schubmehl\", role=\"ctb\"), person(\"Davis\",\"Vaughan\", role=\"ctb\"), person(\"Leonardo\",\"Silvestri\", role=\"ctb\"), person(\"Jim\",\"Hester\", role=\"ctb\"), person(\"Anthony\",\"Damico\", role=\"ctb\"), person(\"Sebastian\",\"Freundt\", role=\"ctb\"), person(\"David\",\"Simons\", role=\"ctb\"), person(\"Elliott\",\"Sales de Andrade\", role=\"ctb\"), person(\"Cole\",\"Miller\", role=\"ctb\"), person(\"Jens Peder\",\"Meldgaard\", role=\"ctb\"), person(\"Vaclav\",\"Tlapak\", role=\"ctb\"), person(\"Kevin\",\"Ushey\", role=\"ctb\"), person(\"Dirk\",\"Eddelbuettel\", role=\"ctb\"), person(\"Tony\",\"Fischetti\", role=\"ctb\"), person(\"Ofek\",\"Shilon\", role=\"ctb\"), person(\"Vadim\",\"Khotilovich\", role=\"ctb\"), person(\"Hadley\",\"Wickham\", role=\"ctb\"), person(\"Bennet\",\"Becker\", role=\"ctb\"), person(\"Kyle\",\"Haynes\", role=\"ctb\"), person(\"Boniface Christian\",\"Kamgang\", role=\"ctb\"), person(\"Olivier\",\"Delmarcell\", role=\"ctb\"), person(\"Josh\",\"O'Brien\", role=\"ctb\"), person(\"Dereck\",\"de Mezquita\", role=\"ctb\"), person(\"Michael\",\"Czekanski\", role=\"ctb\"), person(\"Dmitry\", \"Shemetov\", role=\"ctb\"), person(\"Nitish\", \"Jha\", role=\"ctb\"), person(\"Joshua\", \"Wu\", role=\"ctb\"), person(\"Iago\", \"Gin\u00e9-V\u00e1zquez\", role=\"ctb\"), person(\"Anirban\", \"Chetia\", role=\"ctb\"), person(\"Doris\", \"Amoakohene\", role=\"ctb\"), person(\"Angel\", \"Feliz\", role=\"ctb\"), person(\"Michael\",\"Young\", role=\"ctb\"), person(\"Mark\", \"Seeto\", role=\"ctb\"), person(\"Philippe\", \"Grosjean\", role=\"ctb\"), person(\"Vincent\", \"Runge\", role=\"ctb\"), person(\"Christian\", \"Wia\", role=\"ctb\"), person(\"Elise\", \"Maign\u00e9\", role=\"ctb\"), person(\"Vincent\", \"Rocher\", role=\"ctb\"), person(\"Vijay\", \"Lulla\", role=\"ctb\"), person(\"Alja\u017e\", \"Sluga\", role=\"ctb\"), person(\"Bill\", \"Evans\", role=\"ctb\"), person(\"Reino\", \"Bruner\", role=\"ctb\"), person(given=\"@badasahog\", role=\"ctb\", comment=\"GitHub user\"), person(\"Vinit\", \"Thakur\", role=\"ctb\"), person(\"Mukul\", \"Kumar\", role=\"ctb\"), person(\"Ildik\u00f3\", \"Czeller\", role=\"ctb\"), person(\"Manmita\", \"Das\", role=\"ctb\"), person(\"Tarun\", \"Thammisetty\", role=\"ctb\") )", + "NeedsCompilation": "yes", + "Author": "Tyson Barrett [aut, cre] (ORCID: ), Matt Dowle [aut], Arun Srinivasan [aut], Jan Gorecki [aut], Michael Chirico [aut] (ORCID: ), Toby Hocking [aut] (ORCID: ), Benjamin Schwendinger [aut] (ORCID: ), Ivan Krylov [aut] (ORCID: ), Pasha Stetsenko [ctb], Tom Short [ctb], Steve Lianoglou [ctb], Eduard Antonyan [ctb], Markus Bonsch [ctb], Hugh Parsonage [ctb], Scott Ritchie [ctb], Kun Ren [ctb], Xianying Tan [ctb], Rick Saporta [ctb], Otto Seiskari [ctb], Xianghui Dong [ctb], Michel Lang [ctb], Watal Iwasaki [ctb], Seth Wenchel [ctb], Karl Broman [ctb], Tobias Schmidt [ctb], David Arenburg [ctb], Ethan Smith [ctb], Francois Cocquemas [ctb], Matthieu Gomez [ctb], Philippe Chataignon [ctb], Nello Blaser [ctb], Dmitry Selivanov [ctb], Andrey Riabushenko [ctb], Cheng Lee [ctb], Declan Groves [ctb], Daniel Possenriede [ctb], Felipe Parages [ctb], Denes Toth [ctb], Mus Yaramaz-David [ctb], Ayappan Perumal [ctb], James Sams [ctb], Martin Morgan [ctb], Michael Quinn [ctb], @javrucebo [ctb] (GitHub user), Marc Halperin [ctb], Roy Storey [ctb], Manish Saraswat [ctb], Morgan Jacob [ctb], Michael Schubmehl [ctb], Davis Vaughan [ctb], Leonardo Silvestri [ctb], Jim Hester [ctb], Anthony Damico [ctb], Sebastian Freundt [ctb], David Simons [ctb], Elliott Sales de Andrade [ctb], Cole Miller [ctb], Jens Peder Meldgaard [ctb], Vaclav Tlapak [ctb], Kevin Ushey [ctb], Dirk Eddelbuettel [ctb], Tony Fischetti [ctb], Ofek Shilon [ctb], Vadim Khotilovich [ctb], Hadley Wickham [ctb], Bennet Becker [ctb], Kyle Haynes [ctb], Boniface Christian Kamgang [ctb], Olivier Delmarcell [ctb], Josh O'Brien [ctb], Dereck de Mezquita [ctb], Michael Czekanski [ctb], Dmitry Shemetov [ctb], Nitish Jha [ctb], Joshua Wu [ctb], Iago Gin\u00e9-V\u00e1zquez [ctb], Anirban Chetia [ctb], Doris Amoakohene [ctb], Angel Feliz [ctb], Michael Young [ctb], Mark Seeto [ctb], Philippe Grosjean [ctb], Vincent Runge [ctb], Christian Wia [ctb], Elise Maign\u00e9 [ctb], Vincent Rocher [ctb], Vijay Lulla [ctb], Alja\u017e Sluga [ctb], Bill Evans [ctb], Reino Bruner [ctb], @badasahog [ctb] (GitHub user), Vinit Thakur [ctb], Mukul Kumar [ctb], Ildik\u00f3 Czeller [ctb], Manmita Das [ctb], Tarun Thammisetty [ctb]", + "Maintainer": "Tyson Barrett ", + "Repository": "CRAN" }, "digest": { "Package": "digest", - "Version": "0.6.36", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "fd6824ad91ede64151e93af67df6376b" + "Version": "0.6.39", + "Source": "Repository", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Antoine\", \"Lucas\", role=\"ctb\", comment = c(ORCID = \"0000-0002-8059-9767\")), person(\"Jarek\", \"Tuszynski\", role=\"ctb\"), person(\"Henrik\", \"Bengtsson\", role=\"ctb\", comment = c(ORCID = \"0000-0002-7579-5165\")), person(\"Simon\", \"Urbanek\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2297-1732\")), person(\"Mario\", \"Frasca\", role=\"ctb\"), person(\"Bryan\", \"Lewis\", role=\"ctb\"), person(\"Murray\", \"Stokely\", role=\"ctb\"), person(\"Hannes\", \"Muehleisen\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8552-0029\")), person(\"Duncan\", \"Murdoch\", role=\"ctb\"), person(\"Jim\", \"Hester\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Wush\", \"Wu\", role=\"ctb\", comment = c(ORCID = \"0000-0001-5180-0567\")), person(\"Qiang\", \"Kou\", role=\"ctb\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Thierry\", \"Onkelinx\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8804-4216\")), person(\"Michel\", \"Lang\", role=\"ctb\", comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Viliam\", \"Simko\", role=\"ctb\"), person(\"Kurt\", \"Hornik\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(\"Radford\", \"Neal\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2473-3407\")), person(\"Kendon\", \"Bell\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9093-8312\")), person(\"Matthew\", \"de Queljoe\", role=\"ctb\"), person(\"Dmitry\", \"Selivanov\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0492-6647\")), person(\"Ion\", \"Suruceanu\", role=\"ctb\", comment = c(ORCID = \"0009-0005-6446-4909\")), person(\"Bill\", \"Denney\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\")), person(\"Dirk\", \"Schumacher\", role=\"ctb\"), person(\"Andr\u00e1s\", \"Svraka\", role=\"ctb\", comment = c(ORCID = \"0009-0008-8480-1329\")), person(\"Sergey\", \"Fedorov\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5970-7233\")), person(\"Will\", \"Landau\", role=\"ctb\", comment = c(ORCID = \"0000-0003-1878-3253\")), person(\"Floris\", \"Vanderhaeghe\", role=\"ctb\", comment = c(ORCID = \"0000-0002-6378-6229\")), person(\"Kevin\", \"Tappe\", role=\"ctb\"), person(\"Harris\", \"McGehee\", role=\"ctb\"), person(\"Tim\", \"Mastny\", role=\"ctb\"), person(\"Aaron\", \"Peikert\", role=\"ctb\", comment = c(ORCID = \"0000-0001-7813-818X\")), person(\"Mark\", \"van der Loo\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9807-4686\")), person(\"Chris\", \"Muir\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2555-3878\")), person(\"Moritz\", \"Beller\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4852-0526\")), person(\"Sebastian\", \"Campbell\", role=\"ctb\", comment = c(ORCID = \"0009-0000-5948-4503\")), person(\"Winston\", \"Chang\", role=\"ctb\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Dean\", \"Attali\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5645-3493\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Kevin\", \"Ushey\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Carl\", \"Pearson\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0701-7860\")))", + "Date": "2025-11-19", + "Title": "Create Compact Hash Digests of R Objects", + "Description": "Implementation of a function 'digest()' for the creation of hash digests of arbitrary R objects (using the 'md5', 'sha-1', 'sha-256', 'crc32', 'xxhash', 'murmurhash', 'spookyhash', 'blake3', 'crc32c', 'xxh3_64', and 'xxh3_128' algorithms) permitting easy comparison of R language objects, as well as functions such as 'hmac()' to create hash-based message authentication code. Please note that this package is not meant to be deployed for cryptographic purposes for which more comprehensive (and widely tested) libraries such as 'OpenSSL' should be used.", + "URL": "https://github.com/eddelbuettel/digest, https://eddelbuettel.github.io/digest/, https://dirk.eddelbuettel.com/code/digest.html", + "BugReports": "https://github.com/eddelbuettel/digest/issues", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "utils" + ], + "License": "GPL (>= 2)", + "Suggests": [ + "tinytest", + "simplermarkdown", + "rbenchmark" + ], + "VignetteBuilder": "simplermarkdown", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Antoine Lucas [ctb] (ORCID: ), Jarek Tuszynski [ctb], Henrik Bengtsson [ctb] (ORCID: ), Simon Urbanek [ctb] (ORCID: ), Mario Frasca [ctb], Bryan Lewis [ctb], Murray Stokely [ctb], Hannes Muehleisen [ctb] (ORCID: ), Duncan Murdoch [ctb], Jim Hester [ctb] (ORCID: ), Wush Wu [ctb] (ORCID: ), Qiang Kou [ctb] (ORCID: ), Thierry Onkelinx [ctb] (ORCID: ), Michel Lang [ctb] (ORCID: ), Viliam Simko [ctb], Kurt Hornik [ctb] (ORCID: ), Radford Neal [ctb] (ORCID: ), Kendon Bell [ctb] (ORCID: ), Matthew de Queljoe [ctb], Dmitry Selivanov [ctb] (ORCID: ), Ion Suruceanu [ctb] (ORCID: ), Bill Denney [ctb] (ORCID: ), Dirk Schumacher [ctb], Andr\u00e1s Svraka [ctb] (ORCID: ), Sergey Fedorov [ctb] (ORCID: ), Will Landau [ctb] (ORCID: ), Floris Vanderhaeghe [ctb] (ORCID: ), Kevin Tappe [ctb], Harris McGehee [ctb], Tim Mastny [ctb], Aaron Peikert [ctb] (ORCID: ), Mark van der Loo [ctb] (ORCID: ), Chris Muir [ctb] (ORCID: ), Moritz Beller [ctb] (ORCID: ), Sebastian Campbell [ctb] (ORCID: ), Winston Chang [ctb] (ORCID: ), Dean Attali [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Kevin Ushey [ctb] (ORCID: ), Carl Pearson [ctb] (ORCID: )", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" }, "doParallel": { "Package": "doParallel", - "Version": "1.0.16", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "2dc413572eb42475179bfe0afabd2adf" + "Version": "1.0.17", + "Source": "Repository", + "Type": "Package", + "Title": "Foreach Parallel Adaptor for the 'parallel' Package", + "Authors@R": "c(person(\"Folashade\", \"Daniel\", role=\"cre\", email=\"fdaniel@microsoft.com\"), person(\"Microsoft\", \"Corporation\", role=c(\"aut\", \"cph\")), person(\"Steve\", \"Weston\", role=\"aut\"), person(\"Dan\", \"Tenenbaum\", role=\"ctb\"))", + "Description": "Provides a parallel backend for the %dopar% function using the parallel package.", + "Depends": [ + "R (>= 2.14.0)", + "foreach (>= 1.2.0)", + "iterators (>= 1.0.0)", + "parallel", + "utils" + ], + "Suggests": [ + "caret", + "mlbench", + "rpart", + "RUnit" + ], + "Enhances": [ + "compiler" + ], + "License": "GPL-2", + "URL": "https://github.com/RevolutionAnalytics/doparallel", + "BugReports": "https://github.com/RevolutionAnalytics/doparallel/issues", + "NeedsCompilation": "no", + "Author": "Folashade Daniel [cre], Microsoft Corporation [aut, cph], Steve Weston [aut], Dan Tenenbaum [ctb]", + "Maintainer": "Folashade Daniel ", + "Repository": "CRAN" }, "dplyr": { "Package": "dplyr", - "Version": "1.1.4", + "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "fedd9d00c2944ff00a0e2696ccf048ec" + "Type": "Package", + "Title": "A Grammar of Data Manipulation", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Romain\", \"Fran\u00e7ois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Kirill\", \"M\u00fcller\", role = \"aut\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A fast, consistent tool for working with data frame like objects, both in memory and out of memory.", + "License": "MIT + file LICENSE", + "URL": "https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr", + "BugReports": "https://github.com/tidyverse/dplyr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "cli (>= 3.6.2)", + "generics", + "glue (>= 1.3.2)", + "lifecycle (>= 1.0.5)", + "magrittr (>= 1.5)", + "methods", + "pillar (>= 1.9.0)", + "R6", + "rlang (>= 1.1.7)", + "tibble (>= 3.2.0)", + "tidyselect (>= 1.2.0)", + "utils", + "vctrs (>= 0.7.1)" + ], + "Suggests": [ + "broom", + "covr", + "DBI", + "dbplyr (>= 2.2.1)", + "ggplot2", + "knitr", + "Lahman", + "lobstr", + "nycflights13", + "purrr", + "rmarkdown", + "RSQLite", + "stringi (>= 1.7.6)", + "testthat (>= 3.1.5)", + "tidyr (>= 1.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Romain Fran\u00e7ois [aut] (ORCID: ), Lionel Henry [aut], Kirill M\u00fcller [aut] (ORCID: ), Davis Vaughan [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "evaluate": { "Package": "evaluate", - "Version": "0.23", - "Source": "URL", - "Repository": "CRAN", - "RemoteType": "url", - "RemoteUrl": "https://cran.r-project.org/src/contrib/Archive/evaluate/evaluate_0.23.tar.gz", - "Hash": "7171a28eaa45639b4ea80bb6beaaf0a1" - }, - "fansi": { - "Package": "fansi", - "Version": "1.0.6", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "962174cf2aeb5b9eea581522286a911f" + "Version": "1.0.5", + "Source": "Repository", + "Type": "Package", + "Title": "Parsing and Evaluation Tools that Provide More Details than the Default", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Yihui\", \"Xie\", role = \"aut\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Michael\", \"Lawrence\", role = \"ctb\"), person(\"Thomas\", \"Kluyver\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Adam\", \"Ryczkowski\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Michel\", \"Lang\", role = \"ctb\"), person(\"Karolis\", \"Koncevi\u010dius\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Parsing and evaluation tools that make it easy to recreate the command line behaviour of R.", + "License": "MIT + file LICENSE", + "URL": "https://evaluate.r-lib.org/, https://github.com/r-lib/evaluate", + "BugReports": "https://github.com/r-lib/evaluate/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "covr", + "ggplot2 (>= 3.3.6)", + "lattice", + "methods", + "pkgload", + "ragg (>= 1.4.0)", + "rlang (>= 1.1.5)", + "knitr", + "testthat (>= 3.0.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Yihui Xie [aut] (ORCID: ), Michael Lawrence [ctb], Thomas Kluyver [ctb], Jeroen Ooms [ctb], Barret Schloerke [ctb], Adam Ryczkowski [ctb], Hiroaki Yutani [ctb], Michel Lang [ctb], Karolis Koncevi\u010dius [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "fastmap": { "Package": "fastmap", "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8" + "Title": "Fast Data Structures", + "Authors@R": "c( person(\"Winston\", \"Chang\", email = \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\") )", + "Description": "Fast implementation of data structures, including a key-value store, stack, and queue. Environments are commonly used as key-value stores in R, but every time a new key is used, it is added to R's global symbol table, causing a small amount of memory leakage. This can be problematic in cases where many different keys are used. Fastmap avoids this memory leak issue by implementing the map using data structures in C++.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat (>= 2.1.1)" + ], + "URL": "https://r-lib.github.io/fastmap/, https://github.com/r-lib/fastmap", + "BugReports": "https://github.com/r-lib/fastmap/issues", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd], Tessil [cph] (hopscotch_map library)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "fontawesome": { "Package": "fontawesome", - "Version": "0.5.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d" + "Version": "0.5.3", + "Source": "Repository", + "Type": "Package", + "Title": "Easily Work with 'Font Awesome' Icons", + "Description": "Easily and flexibly insert 'Font Awesome' icons into 'R Markdown' documents and 'Shiny' apps. These icons can be inserted into HTML content through inline 'SVG' tags or 'i' tags. There is also a utility function for exporting 'Font Awesome' icons as 'PNG' images for those situations where raster graphics are needed.", + "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"ctb\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome font\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/fontawesome, https://rstudio.github.io/fontawesome/", + "BugReports": "https://github.com/rstudio/fontawesome/issues", + "Encoding": "UTF-8", + "ByteCompile": "true", + "RoxygenNote": "7.3.2", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "rlang (>= 1.0.6)", + "htmltools (>= 0.5.1.1)" + ], + "Suggests": [ + "covr", + "dplyr (>= 1.0.8)", + "gt (>= 0.9.0)", + "knitr (>= 1.31)", + "testthat (>= 3.0.0)", + "rsvg" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Richard Iannone [aut, cre] (), Christophe Dervieux [ctb] (), Winston Chang [ctb], Dave Gandy [ctb, cph] (Font-Awesome font), Posit Software, PBC [cph, fnd]", + "Maintainer": "Richard Iannone ", + "Repository": "CRAN" }, "foreach": { "Package": "foreach", - "Version": "1.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "e32cfc0973caba11b65b1fa691b4d8c9" + "Version": "1.5.2", + "Source": "Repository", + "Type": "Package", + "Title": "Provides Foreach Looping Construct", + "Authors@R": "c(person(\"Folashade\", \"Daniel\", role=\"cre\", email=\"fdaniel@microsoft.com\"), person(\"Hong\", \"Ooi\", role=\"ctb\"), person(\"Rich\", \"Calaway\", role=\"ctb\"), person(\"Microsoft\", role=c(\"aut\", \"cph\")), person(\"Steve\", \"Weston\", role=\"aut\"))", + "Description": "Support for the foreach looping construct. Foreach is an idiom that allows for iterating over elements in a collection, without the use of an explicit loop counter. This package in particular is intended to be used for its return value, rather than for its side effects. In that sense, it is similar to the standard lapply function, but doesn't require the evaluation of a function. Using foreach without side effects also facilitates executing the loop in parallel.", + "License": "Apache License (== 2.0)", + "URL": "https://github.com/RevolutionAnalytics/foreach", + "BugReports": "https://github.com/RevolutionAnalytics/foreach/issues", + "Depends": [ + "R (>= 2.5.0)" + ], + "Imports": [ + "codetools", + "utils", + "iterators" + ], + "Suggests": [ + "randomForest", + "doMC", + "doParallel", + "testthat", + "knitr", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.1.1", + "Collate": "'callCombine.R' 'foreach.R' 'do.R' 'foreach-ext.R' 'foreach-pkg.R' 'getDoPar.R' 'getDoSeq.R' 'getsyms.R' 'iter.R' 'nextElem.R' 'onLoad.R' 'setDoPar.R' 'setDoSeq.R' 'times.R' 'utils.R'", + "NeedsCompilation": "no", + "Author": "Folashade Daniel [cre], Hong Ooi [ctb], Rich Calaway [ctb], Microsoft [aut, cph], Steve Weston [aut]", + "Maintainer": "Folashade Daniel ", + "Repository": "CRAN" + }, + "foreign": { + "Package": "foreign", + "Version": "0.8-87", + "Source": "Repository", + "Priority": "recommended", + "Date": "2024-06-25", + "Title": "Read Data Stored by 'Minitab', 'S', 'SAS', 'SPSS', 'Stata', 'Systat', 'Weka', 'dBase', ...", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "methods", + "utils", + "stats" + ], + "Authors@R": "c( person(\"R Core Team\", email = \"R-core@R-project.org\", role = c(\"aut\", \"cph\", \"cre\")), person(\"Roger\", \"Bivand\", role = c(\"ctb\", \"cph\")), person(c(\"Vincent\", \"J.\"), \"Carey\", role = c(\"ctb\", \"cph\")), person(\"Saikat\", \"DebRoy\", role = c(\"ctb\", \"cph\")), person(\"Stephen\", \"Eglen\", role = c(\"ctb\", \"cph\")), person(\"Rajarshi\", \"Guha\", role = c(\"ctb\", \"cph\")), person(\"Swetlana\", \"Herbrandt\", role = \"ctb\"), person(\"Nicholas\", \"Lewin-Koh\", role = c(\"ctb\", \"cph\")), person(\"Mark\", \"Myatt\", role = c(\"ctb\", \"cph\")), person(\"Michael\", \"Nelson\", role = \"ctb\"), person(\"Ben\", \"Pfaff\", role = \"ctb\"), person(\"Brian\", \"Quistorff\", role = \"ctb\"), person(\"Frank\", \"Warmerdam\", role = c(\"ctb\", \"cph\")), person(\"Stephen\", \"Weigand\", role = c(\"ctb\", \"cph\")), person(\"Free Software Foundation, Inc.\", role = \"cph\"))", + "Contact": "see 'MailingList'", + "Copyright": "see file COPYRIGHTS", + "Description": "Reading and writing data stored by some versions of 'Epi Info', 'Minitab', 'S', 'SAS', 'SPSS', 'Stata', 'Systat', 'Weka', and for reading and writing some 'dBase' files.", + "ByteCompile": "yes", + "Biarch": "yes", + "License": "GPL (>= 2)", + "BugReports": "https://bugs.r-project.org", + "MailingList": "R-help@r-project.org", + "URL": "https://svn.r-project.org/R-packages/trunk/foreign/", + "NeedsCompilation": "yes", + "Author": "R Core Team [aut, cph, cre], Roger Bivand [ctb, cph], Vincent J. Carey [ctb, cph], Saikat DebRoy [ctb, cph], Stephen Eglen [ctb, cph], Rajarshi Guha [ctb, cph], Swetlana Herbrandt [ctb], Nicholas Lewin-Koh [ctb, cph], Mark Myatt [ctb, cph], Michael Nelson [ctb], Ben Pfaff [ctb], Brian Quistorff [ctb], Frank Warmerdam [ctb, cph], Stephen Weigand [ctb, cph], Free Software Foundation, Inc. [cph]", + "Maintainer": "R Core Team ", + "Repository": "CRAN" }, "fs": { "Package": "fs", - "Version": "1.6.4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "15aeb8c27f5ea5161f9f6a641fafd93a" + "Version": "2.1.0", + "Source": "Repository", + "Title": "Cross-Platform File System Operations Based on 'libuv'", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"G\u00e1bor\", \"Cs\u00e1rdi\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", , \"jeroenooms@gmail.com\", role = \"cre\"), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A cross-platform interface to file system operations, built on top of the 'libuv' C library.", + "License": "MIT + file LICENSE", + "URL": "https://fs.r-lib.org, https://github.com/r-lib/fs", + "BugReports": "https://github.com/r-lib/fs/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "covr", + "crayon", + "knitr", + "pillar (>= 1.0.0)", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "tibble (>= 1.1.0)", + "vctrs (>= 0.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "SystemRequirements": "libuv: libuv-devel (rpm) or libuv1-dev (deb). Alternatively to build the vendored libuv 'cmake' is required. GNU make.", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut], Hadley Wickham [aut], G\u00e1bor Cs\u00e1rdi [aut], Jeroen Ooms [cre], libuv project contributors [cph] (libuv library), Joyent, Inc. and other Node contributors [cph] (libuv library), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "generics": { "Package": "generics", - "Version": "0.1.3", + "Version": "0.1.4", "Source": "Repository", - "Repository": "CRAN", - "Hash": "15e9634c0fcd294799e9b2e929ed1b86" + "Title": "Common S3 Generics not Provided by Base R Methods Related to Model Fitting", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Max\", \"Kuhn\", , \"max@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"https://ror.org/03wc8by49\")) )", + "Description": "In order to reduce potential package dependencies and conflicts, generics provides a number of commonly used S3 generics.", + "License": "MIT + file LICENSE", + "URL": "https://generics.r-lib.org, https://github.com/r-lib/generics", + "BugReports": "https://github.com/r-lib/generics/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "covr", + "pkgload", + "testthat (>= 3.0.0)", + "tibble", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Max Kuhn [aut], Davis Vaughan [aut], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "glue": { "Package": "glue", - "Version": "1.7.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "e0b3a53876554bd45879e596cdb10a52" + "Version": "1.8.1", + "Source": "Repository", + "Title": "Interpreted String Literals", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "An implementation of interpreted string literals, inspired by Python's Literal String Interpolation and Docstrings and Julia's Triple-Quoted String Literals .", + "License": "MIT + file LICENSE", + "URL": "https://glue.tidyverse.org/, https://github.com/tidyverse/glue", + "BugReports": "https://github.com/tidyverse/glue/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "crayon", + "DBI (>= 1.2.0)", + "dplyr", + "knitr", + "rlang", + "rmarkdown", + "RSQLite", + "testthat (>= 3.2.0)", + "vctrs (>= 0.3.0)", + "waldo (>= 0.5.3)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "bench, forcats, ggbeeswarm, ggplot2, R.utils, rprintf, tidyr, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2026-04-16", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "highr": { "Package": "highr", - "Version": "0.11", + "Version": "0.12", "Source": "Repository", - "Repository": "CRAN", - "Hash": "d65ba49117ca223614f71b60d85b8ab7" + "Type": "Package", + "Title": "Syntax Highlighting for R Source Code", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Yixuan\", \"Qiu\", role = \"aut\"), person(\"Christopher\", \"Gandrud\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\") )", + "Description": "Provides syntax highlighting for R source code. Currently it supports LaTeX and HTML output. Source code of other languages is supported via Andre Simon's highlight package ().", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "xfun (>= 0.18)" + ], + "Suggests": [ + "knitr", + "markdown", + "testit" + ], + "License": "GPL", + "URL": "https://github.com/yihui/highr", + "BugReports": "https://github.com/yihui/highr/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (ORCID: ), Yixuan Qiu [aut], Christopher Gandrud [ctb], Qiang Li [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "htmltools": { "Package": "htmltools", - "Version": "0.5.8.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "81d371a9cc60640e74e4ab6ac46dcedc" + "Version": "0.5.9", + "Source": "Repository", + "Type": "Package", + "Title": "Tools for HTML", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools for HTML generation and output.", + "License": "GPL (>= 2)", + "URL": "https://github.com/rstudio/htmltools, https://rstudio.github.io/htmltools/", + "BugReports": "https://github.com/rstudio/htmltools/issues", + "Depends": [ + "R (>= 2.14.1)" + ], + "Imports": [ + "base64enc", + "digest", + "fastmap (>= 1.1.0)", + "grDevices", + "rlang (>= 1.0.0)", + "utils" + ], + "Suggests": [ + "Cairo", + "markdown", + "ragg", + "shiny", + "testthat", + "withr" + ], + "Enhances": [ + "knitr" + ], + "Config/Needs/check": "knitr", + "Config/Needs/website": "rstudio/quillt, bench", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'colors.R' 'fill.R' 'html_dependency.R' 'html_escape.R' 'html_print.R' 'htmltools-package.R' 'images.R' 'known_tags.R' 'selector.R' 'staticimports.R' 'tag_query.R' 'utils.R' 'tags.R' 'template.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Winston Chang [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "htmlwidgets": { "Package": "htmlwidgets", "Version": "1.6.4", "Source": "Repository", - "Repository": "CRAN", - "Hash": "04291cc45198225444a397606810ac37" + "Type": "Package", + "Title": "HTML Widgets for R", + "Authors@R": "c( person(\"Ramnath\", \"Vaidyanathan\", role = c(\"aut\", \"cph\")), person(\"Yihui\", \"Xie\", role = \"aut\"), person(\"JJ\", \"Allaire\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Kenton\", \"Russell\", role = c(\"aut\", \"cph\")), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A framework for creating HTML widgets that render in various contexts including the R console, 'R Markdown' documents, and 'Shiny' web applications.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/ramnathv/htmlwidgets", + "BugReports": "https://github.com/ramnathv/htmlwidgets/issues", + "Imports": [ + "grDevices", + "htmltools (>= 0.5.7)", + "jsonlite (>= 0.9.16)", + "knitr (>= 1.8)", + "rmarkdown", + "yaml" + ], + "Suggests": [ + "testthat" + ], + "Enhances": [ + "shiny (>= 1.1)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Ramnath Vaidyanathan [aut, cph], Yihui Xie [aut], JJ Allaire [aut], Joe Cheng [aut], Carson Sievert [aut, cre] (), Kenton Russell [aut, cph], Ellis Hughes [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "httpcode": { "Package": "httpcode", "Version": "0.3.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "13641a1c6d2cc98801b76764078e17ea" + "Title": "'HTTP' Status Code Helper", + "Description": "Find and explain the meaning of 'HTTP' status codes. Functions included for searching for codes by full or partial number, by message, and get appropriate dog and cat images for many status codes.", + "Authors@R": "person(\"Scott\", \"Chamberlain\", role = c(\"aut\",\"cre\"), email = \"myrmecocystus@gmail.com\", comment = c(ORCID = \"0000-0003-1444-9135\"))", + "License": "MIT + file LICENSE", + "URL": "https://github.com/sckott/httpcode", + "BugReports": "https://github.com/sckott/httpcode/issues", + "Encoding": "UTF-8", + "Language": "en-US", + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.1.0", + "NeedsCompilation": "no", + "Author": "Scott Chamberlain [aut, cre] ()", + "Maintainer": "Scott Chamberlain ", + "Repository": "CRAN" }, "httpuv": { "Package": "httpuv", - "Version": "1.6.15", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "d55aa087c47a63ead0f6fc10f8fa1ee0" + "Version": "1.6.17", + "Source": "Repository", + "Type": "Package", + "Title": "HTTP and WebSocket Server Library", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Hector\", \"Corrada Bravo\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Andrzej\", \"Krzemienski\", role = \"cph\", comment = \"optional.hpp\"), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file\"), person(\"Niels\", \"Provos\", role = \"cph\", comment = \"libuv subcomponent: tree.h\"), person(\"Internet Systems Consortium, Inc.\", role = \"cph\", comment = \"libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c\"), person(\"Alexander\", \"Chemeris\", role = \"cph\", comment = \"libuv subcomponent: stdint-msvc2008.h (from msinttypes)\"), person(\"Google, Inc.\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Sony Mobile Communcations AB\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Berkeley Software Design Inc.\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Kenneth\", \"MacKay\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016)\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Steve\", \"Reid\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"James\", \"Brown\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"Bob\", \"Trower\", role = \"aut\", comment = \"base64 implementation\"), person(\"Alexander\", \"Peslyak\", role = \"aut\", comment = \"MD5 implementation\"), person(\"Trantor Standard Systems\", role = \"cph\", comment = \"base64 implementation\"), person(\"Igor\", \"Sysoev\", role = \"cph\", comment = \"http-parser\") )", + "Description": "Provides low-level socket and protocol support for handling HTTP and WebSocket requests directly from within R. It is primarily intended as a building block for other packages, rather than making it particularly easy to create complete web applications using httpuv alone. httpuv is built on top of the libuv and http-parser C libraries, both of which were developed by Joyent, Inc. (See LICENSE file for libuv and http-parser license information.)", + "License": "GPL (>= 2) | file LICENSE", + "URL": "https://rstudio.github.io/httpuv/, https://github.com/rstudio/httpuv", + "BugReports": "https://github.com/rstudio/httpuv/issues", + "Depends": [ + "R (>= 2.15.1)" + ], + "Imports": [ + "later (>= 0.8.0)", + "promises", + "R6", + "Rcpp (>= 1.0.7)", + "utils" + ], + "Suggests": [ + "callr", + "curl", + "jsonlite", + "testthat (>= 3.0.0)", + "websocket" + ], + "LinkingTo": [ + "later", + "Rcpp" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-07-01", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "GNU make, zlib", + "Collate": "'RcppExports.R' 'httpuv-package.R' 'httpuv.R' 'random_port.R' 'server.R' 'staticServer.R' 'static_paths.R' 'utils.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Winston Chang [aut, cre], Posit, PBC [cph, fnd] (ROR: ), Hector Corrada Bravo [ctb], Jeroen Ooms [ctb], Andrzej Krzemienski [cph] (optional.hpp), libuv project contributors [cph] (libuv library, see src/libuv/AUTHORS file), Joyent, Inc. and other Node contributors [cph] (libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file), Niels Provos [cph] (libuv subcomponent: tree.h), Internet Systems Consortium, Inc. [cph] (libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c), Alexander Chemeris [cph] (libuv subcomponent: stdint-msvc2008.h (from msinttypes)), Google, Inc. [cph] (libuv subcomponent: pthread-fixes.c), Sony Mobile Communcations AB [cph] (libuv subcomponent: pthread-fixes.c), Berkeley Software Design Inc. [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Kenneth MacKay [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016) [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Steve Reid [aut] (SHA-1 implementation), James Brown [aut] (SHA-1 implementation), Bob Trower [aut] (base64 implementation), Alexander Peslyak [aut] (MD5 implementation), Trantor Standard Systems [cph] (base64 implementation), Igor Sysoev [cph] (http-parser)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "httr": { "Package": "httr", - "Version": "1.4.7", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ac107251d9d9fd72f0ca8049988f1d7f" + "Version": "1.4.8", + "Source": "Repository", + "Title": "Tools for Working with URLs and HTTP", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Useful tools for working with HTTP organised by HTTP verbs (GET(), POST(), etc). Configuration functions make it easy to control additional request components (authenticate(), add_headers() and so on).", + "License": "MIT + file LICENSE", + "URL": "https://httr.r-lib.org/, https://github.com/r-lib/httr", + "BugReports": "https://github.com/r-lib/httr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "curl (>= 5.1.0)", + "jsonlite", + "mime", + "openssl (>= 0.8)", + "R6" + ], + "Suggests": [ + "covr", + "httpuv", + "jpeg", + "knitr", + "png", + "readr", + "rmarkdown", + "testthat (>= 0.8.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "iterators": { "Package": "iterators", - "Version": "1.0.13", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "64778782a89480e9a644f69aad9a2877" + "Version": "1.0.14", + "Source": "Repository", + "Type": "Package", + "Title": "Provides Iterator Construct", + "Authors@R": "c(person(\"Folashade\", \"Daniel\", role=\"cre\", email=\"fdaniel@microsoft.com\"), person(\"Revolution\", \"Analytics\", role=c(\"aut\", \"cph\")), person(\"Steve\", \"Weston\", role=\"aut\"))", + "Description": "Support for iterators, which allow a programmer to traverse through all the elements of a vector, list, or other collection of data.", + "URL": "https://github.com/RevolutionAnalytics/iterators", + "Depends": [ + "R (>= 2.5.0)", + "utils" + ], + "Suggests": [ + "RUnit", + "foreach" + ], + "License": "Apache License (== 2.0)", + "NeedsCompilation": "no", + "Author": "Folashade Daniel [cre], Revolution Analytics [aut, cph], Steve Weston [aut]", + "Maintainer": "Folashade Daniel ", + "Repository": "CRAN" }, "jquerylib": { "Package": "jquerylib", "Version": "0.1.4", "Source": "Repository", - "Repository": "CRAN", - "Hash": "5aab57a3bd297eee1c1d862735972182" + "Title": "Obtain 'jQuery' as an HTML Dependency Object", + "Authors@R": "c( person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"), person(family = \"RStudio\", role = \"cph\"), person(family = \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt\") )", + "Description": "Obtain any major version of 'jQuery' () and use it in any webpage generated by 'htmltools' (e.g. 'shiny', 'htmlwidgets', and 'rmarkdown'). Most R users don't need to use this package directly, but other R packages (e.g. 'shiny', 'rmarkdown', etc.) depend on this package to avoid bundling redundant copies of 'jQuery'.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "RoxygenNote": "7.0.2", + "Imports": [ + "htmltools" + ], + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], RStudio [cph], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "jsonlite": { "Package": "jsonlite", - "Version": "1.8.8", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "e1b9c55281c5adc4dd113652d9e26768" + "Version": "2.0.0", + "Source": "Repository", + "Title": "A Simple and Robust JSON Parser and Generator for R", + "License": "MIT + file LICENSE", + "Depends": [ + "methods" + ], + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Duncan\", \"Temple Lang\", role = \"ctb\"), person(\"Lloyd\", \"Hilaiel\", role = \"cph\", comment=\"author of bundled libyajl\"))", + "URL": "https://jeroen.r-universe.dev/jsonlite https://arxiv.org/abs/1403.2805", + "BugReports": "https://github.com/jeroen/jsonlite/issues", + "Maintainer": "Jeroen Ooms ", + "VignetteBuilder": "knitr, R.rsp", + "Description": "A reasonably fast JSON parser and generator, optimized for statistical data and the web. Offers simple, flexible tools for working with JSON in R, and is particularly powerful for building pipelines and interacting with a web API. The implementation is based on the mapping described in the vignette (Ooms, 2014). In addition to converting JSON data from/to R objects, 'jsonlite' contains functions to stream, validate, and prettify JSON data. The unit tests included with the package verify that all edge cases are encoded and decoded consistently for use with dynamic data in systems and applications.", + "Suggests": [ + "httr", + "vctrs", + "testthat", + "knitr", + "rmarkdown", + "R.rsp", + "sf" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Duncan Temple Lang [ctb], Lloyd Hilaiel [cph] (author of bundled libyajl)", + "Repository": "CRAN" }, "knitr": { "Package": "knitr", - "Version": "1.48", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "acf380f300c721da9fde7df115a5f86f" + "Version": "1.51", + "Source": "Repository", + "Type": "Package", + "Title": "A General-Purpose Package for Dynamic Report Generation in R", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Abhraneel\", \"Sarma\", role = \"ctb\"), person(\"Adam\", \"Vogt\", role = \"ctb\"), person(\"Alastair\", \"Andrew\", role = \"ctb\"), person(\"Alex\", \"Zvoleff\", role = \"ctb\"), person(\"Amar\", \"Al-Zubaidi\", role = \"ctb\"), person(\"Andre\", \"Simon\", role = \"ctb\", comment = \"the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de\"), person(\"Aron\", \"Atkins\", role = \"ctb\"), person(\"Aaron\", \"Wolen\", role = \"ctb\"), person(\"Ashley\", \"Manton\", role = \"ctb\"), person(\"Atsushi\", \"Yasumoto\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8335-495X\")), person(\"Ben\", \"Baumer\", role = \"ctb\"), person(\"Brian\", \"Diggs\", role = \"ctb\"), person(\"Brian\", \"Zhang\", role = \"ctb\"), person(\"Bulat\", \"Yapparov\", role = \"ctb\"), person(\"Cassio\", \"Pereira\", role = \"ctb\"), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person(\"David\", \"Hall\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", role = \"ctb\"), person(\"David\", \"Robinson\", role = \"ctb\"), person(\"Doug\", \"Hemken\", role = \"ctb\"), person(\"Duncan\", \"Murdoch\", role = \"ctb\"), person(\"Elio\", \"Campitelli\", role = \"ctb\"), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Emily\", \"Riederer\", role = \"ctb\"), person(\"Fabian\", \"Hirschmann\", role = \"ctb\"), person(\"Fitch\", \"Simeon\", role = \"ctb\"), person(\"Forest\", \"Fang\", role = \"ctb\"), person(c(\"Frank\", \"E\", \"Harrell\", \"Jr\"), role = \"ctb\", comment = \"the Sweavel package at inst/misc/Sweavel.sty\"), person(\"Garrick\", \"Aden-Buie\", role = \"ctb\"), person(\"Gregoire\", \"Detrez\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Hao\", \"Zhu\", role = \"ctb\"), person(\"Heewon\", \"Jeon\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Hodges\", \"Daniel\", role = \"ctb\"), person(\"Jacob\", \"Bien\", role = \"ctb\"), person(\"Jake\", \"Burkhead\", role = \"ctb\"), person(\"James\", \"Manton\", role = \"ctb\"), person(\"Jared\", \"Lander\", role = \"ctb\"), person(\"Jason\", \"Punyon\", role = \"ctb\"), person(\"Javier\", \"Luraschi\", role = \"ctb\"), person(\"Jeff\", \"Arnold\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", role = \"ctb\"), person(\"Jeremy\", \"Ashkenas\", role = c(\"ctb\", \"cph\"), comment = \"the CSS file at inst/misc/docco-classic.css\"), person(\"Jeremy\", \"Stephens\", role = \"ctb\"), person(\"Jim\", \"Hester\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Johannes\", \"Ranke\", role = \"ctb\"), person(\"John\", \"Honaker\", role = \"ctb\"), person(\"John\", \"Muschelli\", role = \"ctb\"), person(\"Jonathan\", \"Keane\", role = \"ctb\"), person(\"JJ\", \"Allaire\", role = \"ctb\"), person(\"Johan\", \"Toloe\", role = \"ctb\"), person(\"Jonathan\", \"Sidi\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Julien\", \"Barnier\", role = \"ctb\"), person(\"Kaiyin\", \"Zhong\", role = \"ctb\"), person(\"Kamil\", \"Slowikowski\", role = \"ctb\"), person(\"Karl\", \"Forner\", role = \"ctb\"), person(c(\"Kevin\", \"K.\"), \"Smith\", role = \"ctb\"), person(\"Kirill\", \"Mueller\", role = \"ctb\"), person(\"Kohske\", \"Takahashi\", role = \"ctb\"), person(\"Lorenz\", \"Walthert\", role = \"ctb\"), person(\"Lucas\", \"Gallindo\", role = \"ctb\"), person(\"Marius\", \"Hofert\", role = \"ctb\"), person(\"Martin\", \"Modr\u00e1k\", role = \"ctb\"), person(\"Michael\", \"Chirico\", role = \"ctb\"), person(\"Michael\", \"Friendly\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", role = \"ctb\"), person(\"Michel\", \"Kuhlmann\", role = \"ctb\"), person(\"Miller\", \"Patrick\", role = \"ctb\"), person(\"Nacho\", \"Caballero\", role = \"ctb\"), person(\"Nick\", \"Salkowski\", role = \"ctb\"), person(\"Niels Richard\", \"Hansen\", role = \"ctb\"), person(\"Noam\", \"Ross\", role = \"ctb\"), person(\"Obada\", \"Mahdi\", role = \"ctb\"), person(\"Pavel N.\", \"Krivitsky\", role = \"ctb\", comment=c(ORCID = \"0000-0002-9101-3362\")), person(\"Pedro\", \"Faria\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\"), person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"), person(\"Rodrigo\", \"Copetti\", role = \"ctb\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Ruaridh\", \"Williamson\", role = \"ctb\"), person(\"Sagiru\", \"Mati\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1413-3974\")), person(\"Scott\", \"Kostyshak\", role = \"ctb\"), person(\"Sebastian\", \"Meyer\", role = \"ctb\"), person(\"Sietse\", \"Brouwer\", role = \"ctb\"), person(c(\"Simon\", \"de\"), \"Bernard\", role = \"ctb\"), person(\"Sylvain\", \"Rousseau\", role = \"ctb\"), person(\"Taiyun\", \"Wei\", role = \"ctb\"), person(\"Thibaut\", \"Assus\", role = \"ctb\"), person(\"Thibaut\", \"Lamadon\", role = \"ctb\"), person(\"Thomas\", \"Leeper\", role = \"ctb\"), person(\"Tim\", \"Mastny\", role = \"ctb\"), person(\"Tom\", \"Torsney-Weir\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = \"ctb\"), person(\"Viktoras\", \"Veitas\", role = \"ctb\"), person(\"Weicheng\", \"Zhu\", role = \"ctb\"), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Zachary\", \"Foster\", role = \"ctb\"), person(\"Zhian N.\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a general-purpose tool for dynamic report generation in R using Literate Programming techniques.", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "evaluate (>= 0.15)", + "highr (>= 0.11)", + "methods", + "tools", + "xfun (>= 0.52)", + "yaml (>= 2.1.19)" + ], + "Suggests": [ + "bslib", + "DBI (>= 0.4-1)", + "digest", + "formatR", + "gifski", + "gridSVG", + "htmlwidgets (>= 0.7)", + "jpeg", + "JuliaCall (>= 0.11.1)", + "magick", + "litedown", + "markdown (>= 1.3)", + "otel", + "otelsdk", + "png", + "ragg", + "reticulate (>= 1.4)", + "rgl (>= 0.95.1201)", + "rlang", + "rmarkdown", + "sass", + "showtext", + "styler (>= 1.2.0)", + "targets (>= 0.6.0)", + "testit", + "tibble", + "tikzDevice (>= 0.10)", + "tinytex (>= 0.56)", + "webshot", + "rstudioapi", + "svglite" + ], + "License": "GPL", + "URL": "https://yihui.org/knitr/", + "BugReports": "https://github.com/yihui/knitr/issues", + "Encoding": "UTF-8", + "VignetteBuilder": "litedown, knitr", + "SystemRequirements": "Package vignettes based on R Markdown v2 or reStructuredText require Pandoc (http://pandoc.org). The function rst2pdf() requires rst2pdf (https://github.com/rst2pdf/rst2pdf).", + "Collate": "'block.R' 'cache.R' 'citation.R' 'hooks-html.R' 'plot.R' 'utils.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'otel.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (ORCID: , URL: https://yihui.org), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (ORCID: ), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modr\u00e1k [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (ORCID: ), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (ORCID: ), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "later": { "Package": "later", - "Version": "1.3.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "a3e051d405326b8b0012377434c62b37" + "Version": "1.4.8", + "Source": "Repository", + "Type": "Package", + "Title": "Utilities for Scheduling Functions to Execute Later with Event Loops", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", + "Description": "Executes arbitrary R or C functions some time after the current time, after the R execution stack has emptied. The functions are scheduled in an event loop.", + "License": "MIT + file LICENSE", + "URL": "https://later.r-lib.org, https://github.com/r-lib/later", + "BugReports": "https://github.com/r-lib/later/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "Rcpp (>= 1.0.10)", + "rlang" + ], + "Suggests": [ + "knitr", + "nanonext", + "promises", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-07-18", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", + "Maintainer": "Charlie Gao ", + "Repository": "CRAN" + }, + "lattice": { + "Package": "lattice", + "Version": "0.22-6", + "Source": "Repository", + "Date": "2024-03-20", + "Priority": "recommended", + "Title": "Trellis Graphics for R", + "Authors@R": "c(person(\"Deepayan\", \"Sarkar\", role = c(\"aut\", \"cre\"), email = \"deepayan.sarkar@r-project.org\", comment = c(ORCID = \"0000-0003-4107-1553\")), person(\"Felix\", \"Andrews\", role = \"ctb\"), person(\"Kevin\", \"Wright\", role = \"ctb\", comment = \"documentation\"), person(\"Neil\", \"Klepeis\", role = \"ctb\"), person(\"Johan\", \"Larsson\", role = \"ctb\", comment = \"miscellaneous improvements\"), person(\"Zhijian (Jason)\", \"Wen\", role = \"cph\", comment = \"filled contour code\"), person(\"Paul\", \"Murrell\", role = \"ctb\", email = \"paul@stat.auckland.ac.nz\"), person(\"Stefan\", \"Eng\", role = \"ctb\", comment = \"violin plot improvements\"), person(\"Achim\", \"Zeileis\", role = \"ctb\", comment = \"modern colors\"), person(\"Alexandre\", \"Courtiol\", role = \"ctb\", comment = \"generics for larrows, lpolygon, lrect and lsegments\") )", + "Description": "A powerful and elegant high-level data visualization system inspired by Trellis graphics, with an emphasis on multivariate data. Lattice is sufficient for typical graphics needs, and is also flexible enough to handle most nonstandard requirements. See ?Lattice for an introduction.", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "KernSmooth", + "MASS", + "latticeExtra", + "colorspace" + ], + "Imports": [ + "grid", + "grDevices", + "graphics", + "stats", + "utils" + ], + "Enhances": [ + "chron", + "zoo" + ], + "LazyLoad": "yes", + "LazyData": "yes", + "License": "GPL (>= 2)", + "URL": "https://lattice.r-forge.r-project.org/", + "BugReports": "https://github.com/deepayan/lattice/issues", + "NeedsCompilation": "yes", + "Author": "Deepayan Sarkar [aut, cre] (), Felix Andrews [ctb], Kevin Wright [ctb] (documentation), Neil Klepeis [ctb], Johan Larsson [ctb] (miscellaneous improvements), Zhijian (Jason) Wen [cph] (filled contour code), Paul Murrell [ctb], Stefan Eng [ctb] (violin plot improvements), Achim Zeileis [ctb] (modern colors), Alexandre Courtiol [ctb] (generics for larrows, lpolygon, lrect and lsegments)", + "Maintainer": "Deepayan Sarkar ", + "Repository": "CRAN" }, "lazyeval": { "Package": "lazyeval", - "Version": "0.2.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "d908914ae53b04d4c0c0fd72ecc35370" + "Version": "0.2.3", + "Source": "Repository", + "Title": "Lazy (Non-Standard) Evaluation", + "Description": "An alternative approach to non-standard evaluation using formulas. Provides a full implementation of LISP style 'quasiquotation', making it easier to generate code with other code.", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", ,\"hadley@rstudio.com\", c(\"aut\", \"cre\")), person(\"RStudio\", role = \"cph\") )", + "License": "GPL-3", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ + "rlang" + ], + "Suggests": [ + "knitr", + "rmarkdown (>= 0.2.65)", + "testthat", + "covr" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.3", + "Config/build/compilation-database": "true", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], RStudio [cph]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "lifecycle": { "Package": "lifecycle", - "Version": "1.0.4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "b8552d117e1b808b09a832f589b79035" + "Version": "1.0.5", + "Source": "Repository", + "Title": "Manage the Life Cycle of your Package Functions", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Manage the life cycle of your exported functions with shared conventions, documentation badges, and user-friendly deprecation warnings.", + "License": "MIT + file LICENSE", + "URL": "https://lifecycle.r-lib.org/, https://github.com/r-lib/lifecycle", + "BugReports": "https://github.com/r-lib/lifecycle/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "rlang (>= 1.1.0)" + ], + "Suggests": [ + "covr", + "knitr", + "lintr (>= 3.1.0)", + "rmarkdown", + "testthat (>= 3.0.1)", + "tibble", + "tidyverse", + "tools", + "vctrs", + "withr", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate, usethis", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "logging": { "Package": "logging", - "Version": "0.10-108", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "fbef2ca79e23f11e033e89317b4c4770" + "Version": "0.10-111", + "Source": "Repository", + "Title": "R Logging Package", + "Authors@R": "c( person(\"Mario\", \"Frasca\", email = \"mariotomo@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Walerian\", \"Sokolowski\", email = \"r-logging@wlogsolutions.com\", role = c(\"aut\")) )", + "Description": "Pure R implementation of the ubiquitous log4j package. It offers hierarchic loggers, multiple handlers per logger, level based filtering, space handling in messages and custom formatting.", + "URL": "https://github.com/WLOGSolutions/r-logging", + "BugReports": "https://github.com/WLOGSolutions/r-logging/issues", + "License": "GPL-3", + "Encoding": "UTF-8", + "Language": "en-US", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "testthat", + "crayon" + ], + "RoxygenNote": "6.1.1", + "NeedsCompilation": "no", + "Author": "Mario Frasca [aut, cre], Walerian Sokolowski [aut]", + "Maintainer": "Mario Frasca ", + "Repository": "CRAN" }, "magrittr": { "Package": "magrittr", - "Version": "2.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "7ce2733a9826b3aeb1775d56fd305472" + "Version": "2.0.5", + "Source": "Repository", + "Type": "Package", + "Title": "A Forward-Pipe Operator for R", + "Authors@R": "c( person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"), comment = \"Original author and creator of magrittr\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"cre\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. There is flexible support for the type of right-hand side expressions. For more information, see package vignette. To quote Rene Magritte, \"Ceci n'est pas un pipe.\"", + "License": "MIT + file LICENSE", + "URL": "https://magrittr.tidyverse.org, https://github.com/tidyverse/magrittr", + "BugReports": "https://github.com/tidyverse/magrittr/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "Yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of magrittr), Hadley Wickham [aut], Lionel Henry [cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "memoise": { "Package": "memoise", "Version": "2.0.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" + "Title": "'Memoisation' of Functions", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Jim\", family = \"Hester\", role = \"aut\"), person(given = \"Winston\", family = \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@rstudio.com\"), person(given = \"Kirill\", family = \"M\u00fcller\", role = \"aut\", email = \"krlmlr+r@mailbox.org\"), person(given = \"Daniel\", family = \"Cook\", role = \"aut\", email = \"danielecook@gmail.com\"), person(given = \"Mark\", family = \"Edmondson\", role = \"ctb\", email = \"r@sunholo.com\"))", + "Description": "Cache the results of a function so that when you call it again with the same arguments it returns the previously computed value.", + "License": "MIT + file LICENSE", + "URL": "https://memoise.r-lib.org, https://github.com/r-lib/memoise", + "BugReports": "https://github.com/r-lib/memoise/issues", + "Imports": [ + "rlang (>= 0.4.10)", + "cachem" + ], + "Suggests": [ + "digest", + "aws.s3", + "covr", + "googleAuthR", + "googleCloudStorageR", + "httr", + "testthat" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut, cre], Kirill M\u00fcller [aut], Daniel Cook [aut], Mark Edmondson [ctb]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "mgcv": { + "Package": "mgcv", + "Version": "1.9-1", + "Source": "Repository", + "Author": "Simon Wood ", + "Maintainer": "Simon Wood ", + "Title": "Mixed GAM Computation Vehicle with Automatic Smoothness Estimation", + "Description": "Generalized additive (mixed) models, some of their extensions and other generalized ridge regression with multiple smoothing parameter estimation by (Restricted) Marginal Likelihood, Generalized Cross Validation and similar, or using iterated nested Laplace approximation for fully Bayesian inference. See Wood (2017) for an overview. Includes a gam() function, a wide variety of smoothers, 'JAGS' support and distributions beyond the exponential family.", + "Priority": "recommended", + "Depends": [ + "R (>= 3.6.0)", + "nlme (>= 3.1-64)" + ], + "Imports": [ + "methods", + "stats", + "graphics", + "Matrix", + "splines", + "utils" + ], + "Suggests": [ + "parallel", + "survival", + "MASS" + ], + "LazyLoad": "yes", + "ByteCompile": "yes", + "License": "GPL (>= 2)", + "NeedsCompilation": "yes", + "Repository": "CRAN" }, "mime": { "Package": "mime", - "Version": "0.12", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "18e9c28c1d3ca1560ce30658b22ce104" + "Version": "0.13", + "Source": "Repository", + "Type": "Package", + "Title": "Map Filenames to MIME Types", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"Beilei\", \"Bian\", role = \"ctb\") )", + "Description": "Guesses the MIME type from a filename extension using the data derived from /etc/mime.types in UNIX-type systems.", + "Imports": [ + "tools" + ], + "License": "GPL", + "URL": "https://github.com/yihui/mime", + "BugReports": "https://github.com/yihui/mime/issues", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre] (, https://yihui.org), Jeffrey Horner [ctb], Beilei Bian [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "miniUI": { "Package": "miniUI", - "Version": "0.1.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "fec5f52652d60615fdb3957b3d74324a" + "Version": "0.1.2", + "Source": "Repository", + "Type": "Package", + "Title": "Shiny UI Widgets for Small Screens", + "Authors@R": "c( person(\"Joe\", \"Cheng\", role = c(\"cre\", \"aut\"), email = \"joe@posit.co\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides UI widget and layout functions for writing Shiny apps that work well on small screens.", + "License": "GPL-3", + "URL": "https://github.com/rstudio/miniUI", + "BugReports": "https://github.com/rstudio/miniUI/issues", + "Imports": [ + "shiny (>= 0.13)", + "htmltools (>= 0.3)", + "utils" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Joe Cheng [cre, aut], Posit Software, PBC [cph, fnd] (03wc8by49)", + "Maintainer": "Joe Cheng ", + "Repository": "CRAN" + }, + "nlme": { + "Package": "nlme", + "Version": "3.1-166", + "Source": "Repository", + "Date": "2024-08-13", + "Priority": "recommended", + "Title": "Linear and Nonlinear Mixed Effects Models", + "Authors@R": "c(person(\"Jos\u00e9\", \"Pinheiro\", role = \"aut\", comment = \"S version\"), person(\"Douglas\", \"Bates\", role = \"aut\", comment = \"up to 2007\"), person(\"Saikat\", \"DebRoy\", role = \"ctb\", comment = \"up to 2002\"), person(\"Deepayan\", \"Sarkar\", role = \"ctb\", comment = \"up to 2005\"), person(\"EISPACK authors\", role = \"ctb\", comment = \"src/rs.f\"), person(\"Siem\", \"Heisterkamp\", role = \"ctb\", comment = \"Author fixed sigma\"), person(\"Bert\", \"Van Willigen\",role = \"ctb\", comment = \"Programmer fixed sigma\"), person(\"Johannes\", \"Ranke\", role = \"ctb\", comment = \"varConstProp()\"), person(\"R Core Team\", email = \"R-core@R-project.org\", role = c(\"aut\", \"cre\")))", + "Contact": "see 'MailingList'", + "Description": "Fit and compare Gaussian linear and nonlinear mixed-effects models.", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "graphics", + "stats", + "utils", + "lattice" + ], + "Suggests": [ + "MASS", + "SASmixed" + ], + "LazyData": "yes", + "Encoding": "UTF-8", + "License": "GPL (>= 2)", + "BugReports": "https://bugs.r-project.org", + "MailingList": "R-help@r-project.org", + "URL": "https://svn.r-project.org/R-packages/trunk/nlme/", + "NeedsCompilation": "yes", + "Author": "Jos\u00e9 Pinheiro [aut] (S version), Douglas Bates [aut] (up to 2007), Saikat DebRoy [ctb] (up to 2002), Deepayan Sarkar [ctb] (up to 2005), EISPACK authors [ctb] (src/rs.f), Siem Heisterkamp [ctb] (Author fixed sigma), Bert Van Willigen [ctb] (Programmer fixed sigma), Johannes Ranke [ctb] (varConstProp()), R Core Team [aut, cre]", + "Maintainer": "R Core Team ", + "Repository": "CRAN" + }, + "nnet": { + "Package": "nnet", + "Version": "7.3-19", + "Source": "Repository", + "Priority": "recommended", + "Date": "2023-05-02", + "Depends": [ + "R (>= 3.0.0)", + "stats", + "utils" + ], + "Suggests": [ + "MASS" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"ripley@stats.ox.ac.uk\"), person(\"William\", \"Venables\", role = \"cph\"))", + "Description": "Software for feed-forward neural networks with a single hidden layer, and for multinomial log-linear models.", + "Title": "Feed-Forward Neural Networks and Multinomial Log-Linear Models", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], William Venables [cph]", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "openssl": { "Package": "openssl", - "Version": "2.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "2bcca3848e4734eb3b16103bc9aa4b8e" + "Version": "2.4.1", + "Source": "Repository", + "Type": "Package", + "Title": "Toolkit for Encryption, Signatures and Certificates Based on OpenSSL", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Oliver\", \"Keyes\", role = \"ctb\"))", + "Description": "Bindings to OpenSSL libssl and libcrypto, plus custom SSH key parsers. Supports RSA, DSA and EC curves P-256, P-384, P-521, and curve25519. Cryptographic signatures can either be created and verified manually or via x509 certificates. AES can be used in cbc, ctr or gcm mode for symmetric encryption; RSA for asymmetric (public key) encryption or EC for Diffie Hellman. High-level envelope functions combine RSA and AES for encrypting arbitrary sized data. Other utilities include key generators, hash functions (md5, sha1, sha256, etc), base64 encoder, a secure random number generator, and 'bignum' math methods for manually performing crypto calculations on large multibyte integers.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/openssl", + "BugReports": "https://github.com/jeroen/openssl/issues", + "SystemRequirements": "OpenSSL >= 1.0.2", + "VignetteBuilder": "knitr", + "Imports": [ + "askpass" + ], + "Suggests": [ + "curl", + "testthat (>= 2.1.0)", + "digest", + "knitr", + "rmarkdown", + "jsonlite", + "jose", + "sodium" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Oliver Keyes [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "otel": { + "Package": "otel", + "Version": "0.2.0", + "Source": "Repository", + "Title": "OpenTelemetry R API", + "Authors@R": "person(\"G\u00e1bor\", \"Cs\u00e1rdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\"))", + "Description": "High-quality, ubiquitous, and portable telemetry to enable effective observability. OpenTelemetry is a collection of tools, APIs, and SDKs used to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) for analysis in order to understand your software's performance and behavior. This package implements the OpenTelemetry API: . Use this package as a dependency if you want to instrument your R package for OpenTelemetry.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "cli", + "glue", + "jsonlite", + "otelsdk", + "processx", + "shiny", + "spelling", + "testthat (>= 3.0.0)", + "utils", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "URL": "https://otel.r-lib.org, https://github.com/r-lib/otel", + "Additional_repositories": "https://github.com/r-lib/otelsdk/releases/download/devel", + "BugReports": "https://github.com/r-lib/otel/issues", + "NeedsCompilation": "no", + "Author": "G\u00e1bor Cs\u00e1rdi [aut, cre]", + "Maintainer": "G\u00e1bor Cs\u00e1rdi ", + "Repository": "CRAN" }, "pillar": { "Package": "pillar", - "Version": "1.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "15da5a8412f317beeee6175fbc76f4bb" + "Version": "1.11.1", + "Source": "Repository", + "Title": "Coloured Formatting for Columns", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\"), person(given = \"RStudio\", role = \"cph\"))", + "Description": "Provides 'pillar' and 'colonnade' generics designed for formatting columns of data using the full range of colours provided by modern terminals.", + "License": "MIT + file LICENSE", + "URL": "https://pillar.r-lib.org/, https://github.com/r-lib/pillar", + "BugReports": "https://github.com/r-lib/pillar/issues", + "Imports": [ + "cli (>= 2.3.0)", + "glue", + "lifecycle", + "rlang (>= 1.0.2)", + "utf8 (>= 1.1.0)", + "utils", + "vctrs (>= 0.5.0)" + ], + "Suggests": [ + "bit64", + "DBI", + "debugme", + "DiagrammeR", + "dplyr", + "formattable", + "ggplot2", + "knitr", + "lubridate", + "nanotime", + "nycflights13", + "palmerpenguins", + "rmarkdown", + "scales", + "stringi", + "survival", + "testthat (>= 3.1.1)", + "tibble", + "units (>= 0.7.2)", + "vdiffr", + "withr" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "format_multi_fuzz, format_multi_fuzz_2, format_multi, ctl_colonnade, ctl_colonnade_1, ctl_colonnade_2", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/gha/extra-packages": "units=?ignore-before-r=4.3.0", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill M\u00fcller [aut, cre] (ORCID: ), Hadley Wickham [aut], RStudio [cph]", + "Maintainer": "Kirill M\u00fcller ", + "Repository": "CRAN" }, "pkgconfig": { "Package": "pkgconfig", "Version": "2.0.3", "Source": "Repository", - "Repository": "CRAN", - "Hash": "01f28d4278f15c76cddbea05899c5d6f" + "Title": "Private Configuration for 'R' Packages", + "Author": "G\u00e1bor Cs\u00e1rdi", + "Maintainer": "G\u00e1bor Cs\u00e1rdi ", + "Description": "Set configuration options on a per-package basis. Options set by a given package only apply to that package, other packages are unaffected.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "Imports": [ + "utils" + ], + "Suggests": [ + "covr", + "testthat", + "disposables (>= 1.0.3)" + ], + "URL": "https://github.com/r-lib/pkgconfig#readme", + "BugReports": "https://github.com/r-lib/pkgconfig/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "CRAN" }, "plyr": { "Package": "plyr", "Version": "1.8.9", "Source": "Repository", - "Repository": "CRAN", - "Hash": "6b8177fd19982f0020743fadbfdbd933" + "Title": "Tools for Splitting, Applying and Combining Data", + "Authors@R": "person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"))", + "Description": "A set of tools that solves a common set of problems: you need to break a big problem down into manageable pieces, operate on each piece and then put all the pieces back together. For example, you might want to fit a model to each spatial location or time point in your study, summarise data by panels or collapse high-dimensional arrays to simpler summary statistics. The development of 'plyr' has been generously supported by 'Becton Dickinson'.", + "License": "MIT + file LICENSE", + "URL": "http://had.co.nz/plyr, https://github.com/hadley/plyr", + "BugReports": "https://github.com/hadley/plyr/issues", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ + "Rcpp (>= 0.11.0)" + ], + "Suggests": [ + "abind", + "covr", + "doParallel", + "foreach", + "iterators", + "itertools", + "tcltk", + "testthat" + ], + "LinkingTo": [ + "Rcpp" + ], + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "promises": { "Package": "promises", - "Version": "1.3.0", + "Version": "1.5.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "434cd5388a3979e74be5c219bcd6e77d" + "Type": "Package", + "Title": "Abstractions for Promise-Based Asynchronous Programming", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides fundamental abstractions for doing asynchronous programming in R using promises. Asynchronous programming is useful for allowing a single R process to orchestrate multiple tasks in the background while also attending to something else. Semantics are similar to 'JavaScript' promises, but with a syntax that is idiomatic R.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/promises/, https://github.com/rstudio/promises", + "BugReports": "https://github.com/rstudio/promises/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "fastmap (>= 1.1.0)", + "later", + "lifecycle", + "magrittr (>= 1.5)", + "otel (>= 0.2.0)", + "R6", + "rlang" + ], + "Suggests": [ + "future (>= 1.21.0)", + "knitr", + "mirai", + "otelsdk (>= 0.2.0)", + "purrr", + "Rcpp", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "vembedr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "rsconnect, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-27", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Barret Schloerke [aut, cre] (ORCID: ), Winston Chang [aut] (ORCID: ), Charlie Gao [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Barret Schloerke ", + "Repository": "CRAN" }, "rAltmetric": { "Package": "rAltmetric", "Version": "0.7.9000", "Source": "GitHub", + "Title": "Retrieves Altmerics Data for Any Published Paper from 'Altmetric.com'", + "Authors@R": "person(\"Karthik\", \"Ram\", email = \"karthik.ram@gmail.com\", role = c(\"aut\", \"cre\"))", + "Description": "Provides a programmatic interface to the citation information and alternate metrics provided by 'Altmetric'. Data from Altmetric allows researchers to immediately track the impact of their published work, without having to wait for citations. This allows for faster engagement with the audience interested in your work. For more information, visit .", + "Depends": [ + "R (>= 3.3.2)" + ], + "License": "MIT + file LICENSE", + "URL": "https://docs.ropensci.org/rAltmetric, https://github.com/ropensci/rAltmetric", + "BugReports": "https://github.com/ropensci/rAltmetric/issues", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "LazyData": "true", + "Imports": [ + "httr", + "jsonlite", + "rlist" + ], + "Suggests": [ + "spelling", + "dplyr", + "testthat", + "covr", + "knitr", + "magrittr", + "purrr", + "rmarkdown" + ], + "RoxygenNote": "6.0.1.9000", + "VignetteBuilder": "knitr", + "Language": "en-US", + "Author": "Karthik Ram [aut, cre]", + "Maintainer": "Karthik Ram ", "RemoteType": "github", "RemoteHost": "api.github.com", + "RemoteUsername": "ropensci", "RemoteRepo": "rAltmetric", - "RemoteUsername": "OpenKnowledgeMaps", - "RemoteRef": "HEAD", - "RemoteSha": "2e0fec44a736a2c6bacc0fbec6d899d7bda12c24", - "Hash": "003ad437f2a08a189a4babc0c07cba89" + "RemoteRef": "master", + "RemoteSha": "81e8790115219c5852c6ed34d6a4d0474e493d39" }, "rappdirs": { "Package": "rappdirs", - "Version": "0.3.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "5e3c5dc0b071b21fa128676560dbe94d" + "Version": "0.3.4", + "Source": "Repository", + "Type": "Package", + "Title": "Application Directories: Determine Where to Save Data, Caches, and Logs", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"trl\", \"cre\", \"cph\")), person(\"Sridhar\", \"Ratnakumar\", role = \"aut\"), person(\"Trent\", \"Mick\", role = \"aut\"), person(\"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(\"Eddy\", \"Petrisor\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = c(\"trl\", \"aut\"), comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Gabor\", \"Csardi\", role = \"ctb\"), person(\"Gregory\", \"Jefferis\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "An easy way to determine which directories on the users computer you should use to save data, caches and logs. A port of Python's 'Appdirs' () to R.", + "License": "MIT + file LICENSE", + "URL": "https://rappdirs.r-lib.org, https://github.com/r-lib/rappdirs", + "BugReports": "https://github.com/r-lib/rappdirs/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Suggests": [ + "covr", + "roxygen2", + "testthat (>= 3.2.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-05", + "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, Posit, PBC. See file LICENSE for details.", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [trl, cre, cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut] (ORCID: ), Gabor Csardi [ctb], Gregory Jefferis [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "rcrossref": { "Package": "rcrossref", - "Version": "1.2.009", + "Version": "1.2.1", "Source": "GitHub", + "Title": "Client for Various 'CrossRef' 'APIs'", + "Description": "Client for various 'CrossRef' 'APIs', including 'metadata' search with their old and newer search 'APIs', get 'citations' in various formats (including 'bibtex', 'citeproc-json', 'rdf-xml', etc.), convert 'DOIs' to 'PMIDs', and 'vice versa', get citations for 'DOIs', and get links to full text of articles when available.", + "License": "MIT + file LICENSE", + "Authors@R": "c( person(\"Scott\", \"Chamberlain\", role = \"aut\"), person(\"Hao\", \"Zhu\", role = \"aut\"), person(\"Najko\", \"Jahn\", role = c(\"aut\", \"cre\"), email = \"najko.jahn@gmail.com\", comment = c(ORCID = \"0000-0001-5105-1463\")), person(\"Carl\", \"Boettiger\", role = \"aut\"), person(\"Karthik\", \"Ram\", role = \"aut\") )", + "URL": "https://docs.ropensci.org/rcrossref/, https://github.com/ropensci/rcrossref", + "BugReports": "https://github.com/ropensci/rcrossref/issues", + "Roxygen": "list(markdown = TRUE)", + "Encoding": "UTF-8", + "Language": "en-US", + "Imports": [ + "methods", + "utils", + "jsonlite (>= 1.5)", + "crul (>= 0.7.4)", + "xml2 (>= 1.1.1)", + "plyr", + "dplyr (>= 0.7.4)", + "tibble", + "R6", + "shiny", + "miniUI", + "stringr", + "DT", + "stats", + "rlang" + ], + "Suggests": [ + "roxygen2 (>= 7.1.0)", + "testthat", + "knitr", + "rmarkdown", + "vcr (>= 0.2.6)", + "bibtex", + "withr" + ], + "RoxygenNote": "7.2.3", + "X-schema.org-applicationCategory": "Literature", + "X-schema.org-keywords": "text-ming, literature, pdf, xml, publications, citations, full-text, TDM, Crossref", + "X-schema.org-isPartOf": "https://ropensci.org", + "Author": "Scott Chamberlain [aut], Hao Zhu [aut], Najko Jahn [aut, cre] (), Carl Boettiger [aut], Karthik Ram [aut]", + "Maintainer": "Najko Jahn ", "RemoteType": "github", "RemoteHost": "api.github.com", - "RemoteRepo": "rcrossref", "RemoteUsername": "OpenKnowledgeMaps", - "RemoteRef": "HEAD", - "RemoteSha": "3af60e484155fde4781d36eb8d30b94b6da03b77", - "Hash": "7214795f0df1a8bc7c2361adad27126b" + "RemoteRepo": "rcrossref", + "RemoteRef": "master", + "RemoteSha": "d829677b6d4244f1168f60ad1c4da5eafa682943" }, "renv": { "Package": "renv", - "Version": "0.14.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "30e5eba91b67f7f4d75d31de14bbfbdc" + "Version": "1.2.3", + "Source": "Repository", + "Type": "Package", + "Title": "Project Environments", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@rstudio.com\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A dependency management toolkit for R. Using 'renv', you can create and manage project-local R libraries, save the state of these libraries to a 'lockfile', and later restore your library as required. Together, these tools can help make your projects more isolated, portable, and reproducible.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/renv/, https://github.com/rstudio/renv", + "BugReports": "https://github.com/rstudio/renv/issues", + "Imports": [ + "utils" + ], + "Suggests": [ + "BiocManager", + "cli", + "compiler", + "covr", + "cpp11", + "curl", + "devtools", + "generics", + "gitcreds", + "jsonlite", + "jsonvalidate", + "knitr", + "miniUI", + "modules", + "packrat", + "pak", + "R6", + "remotes", + "reticulate", + "rmarkdown", + "rstudioapi", + "shiny", + "testthat", + "uuid", + "waldo", + "yaml", + "webfakes" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "bioconductor,python,install,restore,snapshot,retrieve,remotes", + "NeedsCompilation": "no", + "Author": "Kevin Ushey [aut, cre] (ORCID: ), Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Kevin Ushey ", + "Repository": "RSPM" }, "rlang": { "Package": "rlang", - "Version": "1.1.4", + "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "3eec01f8b1dee337674b2e34ab1f9bc1" + "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", + "Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.", + "Authors@R": "c( person(\"Lionel\", \"Henry\", ,\"lionel@posit.co\", c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", ,\"hadley@posit.co\", \"aut\"), person(given = \"mikefc\", email = \"mikefc@coolbutuseless.com\", role = \"cph\", comment = \"Hash implementation based on Mike's xxhashlite\"), person(given = \"Yann\", family = \"Collet\", role = \"cph\", comment = \"Author of the embedded xxHash library\"), person(given = \"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "ByteCompile": "true", + "Biarch": "true", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "utils" + ], + "Suggests": [ + "cli (>= 3.1.0)", + "covr", + "crayon", + "desc", + "fs", + "glue", + "knitr", + "magrittr", + "methods", + "pillar", + "pkgload", + "rmarkdown", + "stats", + "testthat (>= 3.3.2)", + "tibble", + "usethis", + "vctrs (>= 0.2.3)", + "withr" + ], + "Enhances": [ + "winch" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", + "BugReports": "https://github.com/r-lib/rlang/issues", + "Config/build/compilation-database": "true", + "Config/testthat/edition": "3", + "Config/Needs/website": "dplyr, tidyverse/tidytemplate", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], mikefc [cph] (Hash implementation based on Mike's xxhashlite), Yann Collet [cph] (Author of the embedded xxHash library), Posit, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "rlist": { "Package": "rlist", "Version": "0.4.6.2", "Source": "Repository", - "Repository": "CRAN", - "Hash": "290c8ea0700d2e7258082d0025386e68" + "Type": "Package", + "Title": "A Toolbox for Non-Tabular Data Manipulation", + "Author": "Kun Ren ", + "Maintainer": "Kun Ren ", + "Description": "Provides a set of functions for data manipulation with list objects, including mapping, filtering, grouping, sorting, updating, searching, and other useful functions. Most functions are designed to be pipeline friendly so that data processing with lists can be chained.", + "Depends": [ + "R (>= 2.15)" + ], + "Date": "2021-09-02", + "Suggests": [ + "testthat", + "stringdist" + ], + "Imports": [ + "yaml", + "jsonlite", + "XML", + "data.table" + ], + "License": "MIT + file LICENSE", + "URL": "https://renkun-ken.github.io/rlist/, https://github.com/renkun-ken/rlist, https://renkun-ken.github.io/rlist-tutorial/", + "BugReports": "https://github.com/renkun-ken/rlist/issues", + "ByteCompile": "TRUE", + "LazyData": "true", + "RoxygenNote": "7.1.1", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "CRAN" }, "rmarkdown": { "Package": "rmarkdown", - "Version": "2.27", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "27f9502e1cdbfa195f94e03b0f517484" + "Version": "2.31", + "Source": "Repository", + "Type": "Package", + "Title": "Dynamic Documents for R", + "Authors@R": "c( person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Yihui\", \"Xie\", , \"xie@yihui.name\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Javier\", \"Luraschi\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"aut\"), person(\"Aron\", \"Atkins\", , \"aron@posit.co\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Andrew\", \"Dunning\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0464-5036\")), person(\"Atsushi\", \"Yasumoto\", role = c(\"ctb\", \"cph\"), comment = c(ORCID = \"0000-0002-8335-495X\", cph = \"Number sections Lua filter\")), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Carson\", \"Sievert\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Devon\", \"Ryan\", , \"dpryan79@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Jeff\", \"Allen\", , \"jeff@posit.co\", role = \"ctb\"), person(\"JooYoung\", \"Seo\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Malcolm\", \"Barrett\", role = \"ctb\"), person(\"Rob\", \"Hyndman\", , \"Rob.Hyndman@monash.edu\", role = \"ctb\"), person(\"Romain\", \"Lesur\", role = \"ctb\"), person(\"Roy\", \"Storey\", role = \"ctb\"), person(\"Ruben\", \"Arslan\", , \"ruben.arslan@uni-goettingen.de\", role = \"ctb\"), person(\"Sergio\", \"Oller\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Alexander\", \"Farkas\", role = c(\"ctb\", \"cph\"), comment = \"html5shiv library\"), person(\"Scott\", \"Jehl\", role = c(\"ctb\", \"cph\"), comment = \"Respond.js library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"Greg\", \"Franko\", role = c(\"ctb\", \"cph\"), comment = \"tocify library\"), person(\"John\", \"MacFarlane\", role = c(\"ctb\", \"cph\"), comment = \"Pandoc templates\"), person(, \"Google, Inc.\", role = c(\"ctb\", \"cph\"), comment = \"ioslides library\"), person(\"Dave\", \"Raggett\", role = \"ctb\", comment = \"slidy library\"), person(, \"W3C\", role = \"cph\", comment = \"slidy library\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome\"), person(\"Ben\", \"Sperry\", role = \"ctb\", comment = \"Ionicons\"), person(, \"Drifty\", role = \"cph\", comment = \"Ionicons\"), person(\"Aidan\", \"Lister\", role = c(\"ctb\", \"cph\"), comment = \"jQuery StickyTabs\"), person(\"Benct Philip\", \"Jonsson\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\"), person(\"Albert\", \"Krewinkel\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\") )", + "Description": "Convert R Markdown documents into a variety of formats.", + "License": "GPL-3", + "URL": "https://github.com/rstudio/rmarkdown, https://pkgs.rstudio.com/rmarkdown/", + "BugReports": "https://github.com/rstudio/rmarkdown/issues", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "bslib (>= 0.2.5.1)", + "evaluate (>= 0.13)", + "fontawesome (>= 0.5.0)", + "htmltools (>= 0.5.1)", + "jquerylib", + "jsonlite", + "knitr (>= 1.43)", + "methods", + "tinytex (>= 0.31)", + "tools", + "utils", + "xfun (>= 0.36)", + "yaml (>= 2.1.19)" + ], + "Suggests": [ + "digest", + "dygraphs", + "fs", + "rsconnect", + "downlit (>= 0.4.0)", + "katex (>= 1.4.0)", + "sass (>= 0.4.0)", + "shiny (>= 1.6.0)", + "testthat (>= 3.0.3)", + "tibble", + "vctrs", + "cleanrmd", + "withr (>= 2.4.2)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "rstudio/quillt, pkgdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "pandoc (>= 1.14) - http://pandoc.org", + "NeedsCompilation": "no", + "Author": "JJ Allaire [aut], Yihui Xie [aut, cre] (ORCID: ), Christophe Dervieux [aut] (ORCID: ), Jonathan McPherson [aut], Javier Luraschi [aut], Kevin Ushey [aut], Aron Atkins [aut], Hadley Wickham [aut], Joe Cheng [aut], Winston Chang [aut], Richard Iannone [aut] (ORCID: ), Andrew Dunning [ctb] (ORCID: ), Atsushi Yasumoto [ctb, cph] (ORCID: , cph: Number sections Lua filter), Barret Schloerke [ctb], Carson Sievert [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Frederik Aust [ctb] (ORCID: ), Jeff Allen [ctb], JooYoung Seo [ctb] (ORCID: ), Malcolm Barrett [ctb], Rob Hyndman [ctb], Romain Lesur [ctb], Roy Storey [ctb], Ruben Arslan [ctb], Sergio Oller [ctb], Posit Software, PBC [cph, fnd], jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Alexander Farkas [ctb, cph] (html5shiv library), Scott Jehl [ctb, cph] (Respond.js library), Ivan Sagalaev [ctb, cph] (highlight.js library), Greg Franko [ctb, cph] (tocify library), John MacFarlane [ctb, cph] (Pandoc templates), Google, Inc. [ctb, cph] (ioslides library), Dave Raggett [ctb] (slidy library), W3C [cph] (slidy library), Dave Gandy [ctb, cph] (Font-Awesome), Ben Sperry [ctb] (Ionicons), Drifty [cph] (Ionicons), Aidan Lister [ctb, cph] (jQuery StickyTabs), Benct Philip Jonsson [ctb, cph] (pagebreak Lua filter), Albert Krewinkel [ctb, cph] (pagebreak Lua filter)", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" + }, + "rpart": { + "Package": "rpart", + "Version": "4.1.23", + "Source": "Repository", + "Priority": "recommended", + "Date": "2023-12-04", + "Authors@R": "c(person(\"Terry\", \"Therneau\", role = \"aut\", email = \"therneau@mayo.edu\"), person(\"Beth\", \"Atkinson\", role = c(\"aut\", \"cre\"), email = \"atkinson@mayo.edu\"), person(\"Brian\", \"Ripley\", role = \"trl\", email = \"ripley@stats.ox.ac.uk\", comment = \"producer of the initial R port, maintainer 1999-2017\"))", + "Description": "Recursive partitioning for classification, regression and survival trees. An implementation of most of the functionality of the 1984 book by Breiman, Friedman, Olshen and Stone.", + "Title": "Recursive Partitioning and Regression Trees", + "Depends": [ + "R (>= 2.15.0)", + "graphics", + "stats", + "grDevices" + ], + "Suggests": [ + "survival" + ], + "License": "GPL-2 | GPL-3", + "LazyData": "yes", + "ByteCompile": "yes", + "NeedsCompilation": "yes", + "Author": "Terry Therneau [aut], Beth Atkinson [aut, cre], Brian Ripley [trl] (producer of the initial R port, maintainer 1999-2017)", + "Maintainer": "Beth Atkinson ", + "Repository": "CRAN", + "URL": "https://github.com/bethatkinson/rpart, https://cran.r-project.org/package=rpart", + "BugReports": "https://github.com/bethatkinson/rpart/issues" }, "sass": { "Package": "sass", - "Version": "0.4.9", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "d53dbfddf695303ea4ad66f86e99b95d" + "Version": "0.4.10", + "Source": "Repository", + "Type": "Package", + "Title": "Syntactically Awesome Style Sheets ('Sass')", + "Description": "An 'SCSS' compiler, powered by the 'LibSass' library. With this, R developers can use variables, inheritance, and functions to generate dynamic style sheets. The package uses the 'Sass CSS' extension language, which is stable, powerful, and CSS compatible.", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@rstudio.com\", \"aut\"), person(\"Timothy\", \"Mastny\", , \"tim.mastny@gmail.com\", \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Barret\", \"Schloerke\", , \"barret@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Carson\", \"Sievert\", , \"carson@rstudio.com\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Christophe\", \"Dervieux\", , \"cderv@rstudio.com\", c(\"ctb\"), comment = c(ORCID = \"0000-0003-4474-2498\")), person(family = \"RStudio\", role = c(\"cph\", \"fnd\")), person(family = \"Sass Open Source Foundation\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Greter\", \"Marcel\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Mifsud\", \"Michael\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Hampton\", \"Catlin\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Natalie\", \"Weizenbaum\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Chris\", \"Eppstein\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Adams\", \"Joseph\", role = c(\"ctb\", \"cph\"), comment = \"json.cpp\"), person(\"Trifunovic\", \"Nemanja\", role = c(\"ctb\", \"cph\"), comment = \"utf8.h\") )", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/sass/, https://github.com/rstudio/sass", + "BugReports": "https://github.com/rstudio/sass/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make", + "Imports": [ + "fs (>= 1.2.4)", + "rlang (>= 0.4.10)", + "htmltools (>= 0.5.1)", + "R6", + "rappdirs" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "withr", + "shiny", + "curl" + ], + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Timothy Mastny [aut], Richard Iannone [aut] (), Barret Schloerke [aut] (), Carson Sievert [aut, cre] (), Christophe Dervieux [ctb] (), RStudio [cph, fnd], Sass Open Source Foundation [ctb, cph] (LibSass library), Greter Marcel [ctb, cph] (LibSass library), Mifsud Michael [ctb, cph] (LibSass library), Hampton Catlin [ctb, cph] (LibSass library), Natalie Weizenbaum [ctb, cph] (LibSass library), Chris Eppstein [ctb, cph] (LibSass library), Adams Joseph [ctb, cph] (json.cpp), Trifunovic Nemanja [ctb, cph] (utf8.h)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "shiny": { "Package": "shiny", - "Version": "1.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "01666113b04d504390d60736f39bd0d0" + "Version": "1.13.0", + "Source": "Repository", + "Type": "Package", + "Title": "Web Application Framework for R", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Garrick\", \"Aden-Buie\", , \"garrick@adenbuie.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Alan\", \"Dipert\", role = \"aut\"), person(\"Barbara\", \"Borges\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Prem Nawaz\", \"Khan\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Victor\", \"Tsaran\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Dennis\", \"Lembree\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Srinivasu\", \"Chakravarthula\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Cathy\", \"O'Connor\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(, \"PayPal, Inc\", role = \"cph\", comment = \"Bootstrap accessibility plugin\"), person(\"Stefan\", \"Petre\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Andrew\", \"Rowls\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Salmen\", \"Bejaoui\", role = c(\"ctb\", \"cph\"), comment = \"selectize-plugin-a11y library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\"), person(, \"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"R Core Team\", role = c(\"ctb\", \"cph\"), comment = \"tar implementation from R\") )", + "Description": "Makes it incredibly easy to build interactive web applications with R. Automatic \"reactive\" binding between inputs and outputs and extensive prebuilt widgets make it possible to build beautiful, responsive, and powerful applications with minimal effort.", + "License": "MIT + file LICENSE", + "URL": "https://shiny.posit.co/, https://github.com/rstudio/shiny", + "BugReports": "https://github.com/rstudio/shiny/issues", + "Depends": [ + "methods", + "R (>= 3.1.2)" + ], + "Imports": [ + "bslib (>= 0.6.0)", + "cachem (>= 1.1.0)", + "cli", + "commonmark (>= 2.0.0)", + "fastmap (>= 1.1.1)", + "fontawesome (>= 0.4.0)", + "glue (>= 1.3.2)", + "grDevices", + "htmltools (>= 0.5.4)", + "httpuv (>= 1.5.2)", + "jsonlite (>= 0.9.16)", + "later (>= 1.0.0)", + "lifecycle (>= 0.2.0)", + "mime (>= 0.3)", + "otel", + "promises (>= 1.5.0)", + "R6 (>= 2.0)", + "rlang (>= 0.4.10)", + "sourcetools", + "tools", + "utils", + "withr", + "xtable" + ], + "Suggests": [ + "Cairo (>= 1.5-5)", + "coro (>= 1.1.0)", + "datasets", + "DT", + "dygraphs", + "future", + "ggplot2", + "knitr (>= 1.6)", + "magrittr", + "markdown", + "mirai", + "otelsdk (>= 0.2.0)", + "ragg", + "reactlog (>= 1.0.0)", + "rmarkdown", + "sass", + "showtext", + "testthat (>= 3.2.1)", + "watcher", + "yaml" + ], + "Config/Needs/check": "shinytest2", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'globals.R' 'app-state.R' 'app_template.R' 'bind-cache.R' 'bind-event.R' 'bookmark-state-local.R' 'bookmark-state.R' 'bootstrap-deprecated.R' 'bootstrap-layout.R' 'conditions.R' 'map.R' 'utils.R' 'bootstrap.R' 'busy-indicators-spinners.R' 'busy-indicators.R' 'cache-utils.R' 'deprecated.R' 'devmode.R' 'diagnose.R' 'extended-task.R' 'fileupload.R' 'graph.R' 'reactives.R' 'reactive-domains.R' 'history.R' 'hooks.R' 'html-deps.R' 'image-interact-opts.R' 'image-interact.R' 'imageutils.R' 'input-action.R' 'input-checkbox.R' 'input-checkboxgroup.R' 'input-date.R' 'input-daterange.R' 'input-file.R' 'input-numeric.R' 'input-password.R' 'input-radiobuttons.R' 'input-select.R' 'input-slider.R' 'input-submit.R' 'input-text.R' 'input-textarea.R' 'input-utils.R' 'insert-tab.R' 'insert-ui.R' 'jqueryui.R' 'knitr.R' 'middleware-shiny.R' 'middleware.R' 'timer.R' 'shiny.R' 'mock-session.R' 'modal.R' 'modules.R' 'notifications.R' 'otel-attr-srcref.R' 'otel-collect.R' 'otel-enable.R' 'otel-error.R' 'otel-label.R' 'otel-reactive-update.R' 'otel-session.R' 'otel-shiny.R' 'otel-with.R' 'priorityqueue.R' 'progress.R' 'react.R' 'reexports.R' 'render-cached-plot.R' 'render-plot.R' 'render-table.R' 'run-url.R' 'runapp.R' 'serializers.R' 'server-input-handlers.R' 'server-resource-paths.R' 'server.R' 'shiny-options.R' 'shiny-package.R' 'shinyapp.R' 'shinyui.R' 'shinywrappers.R' 'showcase.R' 'snapshot.R' 'staticimports.R' 'tar.R' 'test-export.R' 'test-server.R' 'test.R' 'update-input.R' 'utils-lang.R' 'utils-tags.R' 'version_bs_date_picker.R' 'version_ion_range_slider.R' 'version_jquery.R' 'version_jqueryui.R' 'version_selectize.R' 'version_strftime.R' 'viewer.R'", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], JJ Allaire [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Garrick Aden-Buie [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Jonathan McPherson [aut], Alan Dipert [aut], Barbara Borges [aut], Posit Software, PBC [cph, fnd] (ROR: ), jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Prem Nawaz Khan [ctb] (Bootstrap accessibility plugin), Victor Tsaran [ctb] (Bootstrap accessibility plugin), Dennis Lembree [ctb] (Bootstrap accessibility plugin), Srinivasu Chakravarthula [ctb] (Bootstrap accessibility plugin), Cathy O'Connor [ctb] (Bootstrap accessibility plugin), PayPal, Inc [cph] (Bootstrap accessibility plugin), Stefan Petre [ctb, cph] (Bootstrap-datepicker library), Andrew Rowls [ctb, cph] (Bootstrap-datepicker library), Brian Reavis [ctb, cph] (selectize.js library), Salmen Bejaoui [ctb, cph] (selectize-plugin-a11y library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library), SpryMedia Limited [ctb, cph] (DataTables library), Ivan Sagalaev [ctb, cph] (highlight.js library), R Core Team [ctb, cph] (tar implementation from R)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "sourcetools": { "Package": "sourcetools", - "Version": "0.1.7-1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "5f5a7629f956619d519205ec475fe647" + "Version": "0.1.7-2", + "Source": "Repository", + "Type": "Package", + "Title": "Tools for Reading, Tokenizing and Parsing R Code", + "Authors@R": "person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevinushey@gmail.com\")", + "Maintainer": "Kevin Ushey ", + "Description": "Tools for the reading and tokenization of R code. The 'sourcetools' package provides both an R and C++ interface for the tokenization of R code, and helpers for interacting with the tokenized representation of R code.", + "License": "MIT + file LICENSE", + "Depends": [ + "R (>= 3.0.2)" + ], + "Suggests": [ + "testthat" + ], + "RoxygenNote": "5.0.1", + "BugReports": "https://github.com/kevinushey/sourcetools/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Kevin Ushey [aut, cre]", + "Repository": "CRAN" + }, + "spatial": { + "Package": "spatial", + "Version": "7.3-17", + "Source": "Repository", + "Priority": "recommended", + "Date": "2023-07-20", + "Depends": [ + "R (>= 3.0.0)", + "graphics", + "stats", + "utils" + ], + "Suggests": [ + "MASS" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"ripley@stats.ox.ac.uk\"), person(\"Roger\", \"Bivand\", role = \"ctb\"), person(\"William\", \"Venables\", role = \"cph\"))", + "Description": "Functions for kriging and point pattern analysis.", + "Title": "Functions for Kriging and Point Pattern Analysis", + "LazyLoad": "yes", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], Roger Bivand [ctb], William Venables [cph]", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "stringdist": { "Package": "stringdist", - "Version": "0.9.12", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "f360720fa3feb7db9d4133b31ebb067f" + "Version": "0.9.17", + "Source": "Repository", + "Maintainer": "Mark van der Loo ", + "License": "GPL-3", + "Title": "Approximate String Matching, Fuzzy Text Search, and String Distance Functions", + "Type": "Package", + "LazyLoad": "yes", + "Authors@R": "c( person(\"Mark\", \"van der Loo\", role=c(\"aut\",\"cre\") , email=\"mark.vanderloo@gmail.com\" , comment= c(ORCID=\"0000-0002-9807-4686\")) , person(\"Jan\", \"van der Laan\", role=\"ctb\") , person(\"R Core Team\",\"\" , role=\"ctb\") , person(\"Nick\",\"Logan\" , role=\"ctb\") , person(\"Chris\",\"Muir\" , role=\"ctb\") , person(\"Johannes\", \"Gruber\" , role=\"ctb\") , person(\"Brian\",\"Ripley\" , role=\"ctb\"))", + "Description": "Implements an approximate string matching version of R's native 'match' function. Also offers fuzzy text search based on various string distance measures. Can calculate various string distances based on edits (Damerau-Levenshtein, Hamming, Levenshtein, optimal sting alignment), qgrams (q- gram, cosine, jaccard distance) or heuristic metrics (Jaro, Jaro-Winkler). An implementation of soundex is provided as well. Distances can be computed between character vectors while taking proper care of encoding or between integer vectors representing generic sequences. This package is built for speed and runs in parallel by using 'openMP'. An API for C or C++ is exposed as well. Reference: MPJ van der Loo (2014) .", + "Depends": [ + "R (>= 2.15.3)" + ], + "URL": "https://github.com/markvanderloo/stringdist", + "BugReports": "https://github.com/markvanderloo/stringdist/issues", + "Suggests": [ + "tinytest" + ], + "Imports": [ + "parallel" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Mark van der Loo [aut, cre] (ORCID: ), Jan van der Laan [ctb], R Core Team [ctb], Nick Logan [ctb], Chris Muir [ctb], Johannes Gruber [ctb], Brian Ripley [ctb]", + "Repository": "CRAN" }, "stringi": { "Package": "stringi", - "Version": "1.8.4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "39e1144fd75428983dc3f63aa53dfa91" + "Version": "1.8.7", + "Source": "Repository", + "Date": "2025-03-27", + "Title": "Fast and Portable Character String Processing Facilities", + "Description": "A collection of character string/text/natural language processing tools for pattern searching (e.g., with 'Java'-like regular expressions or the 'Unicode' collation algorithm), random string generation, case mapping, string transliteration, concatenation, sorting, padding, wrapping, Unicode normalisation, date-time formatting and parsing, and many more. They are fast, consistent, convenient, and - thanks to 'ICU' (International Components for Unicode) - portable across all locales and platforms. Documentation about 'stringi' is provided via its website at and the paper by Gagolewski (2022, ).", + "URL": "https://stringi.gagolewski.com/, https://github.com/gagolews/stringi, https://icu.unicode.org/", + "BugReports": "https://github.com/gagolews/stringi/issues", + "SystemRequirements": "ICU4C (>= 61, optional)", + "Type": "Package", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "tools", + "utils", + "stats" + ], + "Biarch": "TRUE", + "License": "file LICENSE", + "Authors@R": "c(person(given = \"Marek\", family = \"Gagolewski\", role = c(\"aut\", \"cre\", \"cph\"), email = \"marek@gagolewski.com\", comment = c(ORCID = \"0000-0003-0637-6028\")), person(given = \"Bartek\", family = \"Tartanus\", role = \"ctb\"), person(\"Unicode, Inc. and others\", role=\"ctb\", comment = \"ICU4C source code, Unicode Character Database\") )", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Marek Gagolewski [aut, cre, cph] (), Bartek Tartanus [ctb], Unicode, Inc. and others [ctb] (ICU4C source code, Unicode Character Database)", + "Maintainer": "Marek Gagolewski ", + "License_is_FOSS": "yes", + "Repository": "CRAN" }, "stringr": { "Package": "stringr", - "Version": "1.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "960e2ae9e09656611e0b8214ad543207" + "Version": "1.6.0", + "Source": "Repository", + "Title": "Simple, Consistent Wrappers for Common String Operations", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\", \"cph\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A consistent, simple and easy to use set of wrappers around the fantastic 'stringi' package. All function and argument names (and positions) are consistent, all functions deal with \"NA\"'s and zero length vectors in the same way, and the output from one function is easy to feed into the input of another.", + "License": "MIT + file LICENSE", + "URL": "https://stringr.tidyverse.org, https://github.com/tidyverse/stringr", + "BugReports": "https://github.com/tidyverse/stringr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "cli", + "glue (>= 1.6.1)", + "lifecycle (>= 1.0.3)", + "magrittr", + "rlang (>= 1.0.0)", + "stringi (>= 1.5.3)", + "vctrs (>= 0.4.0)" + ], + "Suggests": [ + "covr", + "dplyr", + "gt", + "htmltools", + "htmlwidgets", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/potools/style": "explicit", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre, cph], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "survival": { + "Package": "survival", + "Version": "3.7-0", + "Source": "Repository", + "Title": "Survival Analysis", + "Priority": "recommended", + "Date": "2024-06-01", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "graphics", + "Matrix", + "methods", + "splines", + "stats", + "utils" + ], + "LazyData": "Yes", + "LazyDataCompression": "xz", + "ByteCompile": "Yes", + "Authors@R": "c(person(c(\"Terry\", \"M\"), \"Therneau\", email=\"therneau.terry@mayo.edu\", role=c(\"aut\", \"cre\")), person(\"Thomas\", \"Lumley\", role=c(\"ctb\", \"trl\"), comment=\"original S->R port and R maintainer until 2009\"), person(\"Atkinson\", \"Elizabeth\", role=\"ctb\"), person(\"Crowson\", \"Cynthia\", role=\"ctb\"))", + "Description": "Contains the core survival analysis routines, including definition of Surv objects, Kaplan-Meier and Aalen-Johansen (multi-state) curves, Cox models, and parametric accelerated failure time models.", + "License": "LGPL (>= 2)", + "URL": "https://github.com/therneau/survival", + "NeedsCompilation": "yes", + "Author": "Terry M Therneau [aut, cre], Thomas Lumley [ctb, trl] (original S->R port and R maintainer until 2009), Atkinson Elizabeth [ctb], Crowson Cynthia [ctb]", + "Maintainer": "Terry M Therneau ", + "Repository": "CRAN" }, "sys": { "Package": "sys", - "Version": "3.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "3a1be13d68d47a8cd0bfd74739ca1555" + "Version": "3.4.3", + "Source": "Repository", + "Type": "Package", + "Title": "Powerful and Reliable Tools for Running System Commands in R", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"G\u00e1bor\", \"Cs\u00e1rdi\", , \"csardi.gabor@gmail.com\", role = \"ctb\"))", + "Description": "Drop-in replacements for the base system2() function with fine control and consistent behavior across platforms. Supports clean interruption, timeout, background tasks, and streaming STDIN / STDOUT / STDERR over binary or text connections. Arguments on Windows automatically get encoded and quoted to work on different locales.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/sys", + "BugReports": "https://github.com/jeroen/sys/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.1", + "Suggests": [ + "unix (>= 1.4)", + "spelling", + "testthat" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), G\u00e1bor Cs\u00e1rdi [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "tibble": { "Package": "tibble", - "Version": "3.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "a84e2cc86d07289b3b6f5069df7a004c" + "Version": "3.3.1", + "Source": "Repository", + "Title": "Simple Data Frames", + "Authors@R": "c( person(\"Kirill\", \"M\u00fcller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Romain\", \"Francois\", , \"romain@r-enthusiasts.com\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@rstudio.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides a 'tbl_df' class (the 'tibble') with stricter checking and better formatting than the traditional data frame.", + "License": "MIT + file LICENSE", + "URL": "https://tibble.tidyverse.org/, https://github.com/tidyverse/tibble", + "BugReports": "https://github.com/tidyverse/tibble/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "cli", + "lifecycle (>= 1.0.0)", + "magrittr", + "methods", + "pillar (>= 1.8.1)", + "pkgconfig", + "rlang (>= 1.0.2)", + "utils", + "vctrs (>= 0.5.0)" + ], + "Suggests": [ + "bench", + "bit64", + "blob", + "brio", + "callr", + "DiagrammeR", + "dplyr", + "evaluate", + "formattable", + "ggplot2", + "here", + "hms", + "htmltools", + "knitr", + "lubridate", + "nycflights13", + "pkgload", + "purrr", + "rmarkdown", + "stringi", + "testthat (>= 3.0.2)", + "tidyr", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/autostyle/rmd": "false", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "vignette-formats, as_tibble, add, invariants", + "Config/usethis/last-upkeep": "2025-06-07", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "yes", + "Author": "Kirill M\u00fcller [aut, cre] (ORCID: ), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Kirill M\u00fcller ", + "Repository": "CRAN" }, "tidyselect": { "Package": "tidyselect", "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "829f27b9c4919c16b593794a6344d6c0" + "Title": "Select from a Set of Strings", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A backend for the selecting functions of the 'tidyverse'. It makes it easy to implement select-like functions in your own packages in a way that is consistent with other 'tidyverse' interfaces for selection.", + "License": "MIT + file LICENSE", + "URL": "https://tidyselect.r-lib.org, https://github.com/r-lib/tidyselect", + "BugReports": "https://github.com/r-lib/tidyselect/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "cli (>= 3.3.0)", + "glue (>= 1.3.0)", + "lifecycle (>= 1.0.3)", + "rlang (>= 1.0.4)", + "vctrs (>= 0.5.2)", + "withr" + ], + "Suggests": [ + "covr", + "crayon", + "dplyr", + "knitr", + "magrittr", + "rmarkdown", + "stringr", + "testthat (>= 3.1.1)", + "tibble (>= 2.1.3)" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.0.9000", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "tinytex": { "Package": "tinytex", - "Version": "0.52", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "cfbad971a71f0e27cec22e544a08bc3b" + "Version": "0.59", + "Source": "Repository", + "Type": "Package", + "Title": "Helper Functions to Install and Maintain TeX Live, and Compile LaTeX Documents", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Devon\", \"Ryan\", role = \"ctb\", email = \"dpryan79@gmail.com\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Ethan\", \"Heinzen\", role = \"ctb\"), person(\"Fernando\", \"Cagua\", role = \"ctb\"), person() )", + "Description": "Helper functions to install and maintain the 'LaTeX' distribution named 'TinyTeX' (), a lightweight, cross-platform, portable, and easy-to-maintain version of 'TeX Live'. This package also contains helper functions to compile 'LaTeX' documents, and install missing 'LaTeX' packages automatically.", + "Imports": [ + "xfun (>= 0.48)" + ], + "Suggests": [ + "testit", + "rstudioapi" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/tinytex", + "BugReports": "https://github.com/rstudio/tinytex/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre, cph] (ORCID: ), Posit Software, PBC [cph, fnd], Christophe Dervieux [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Ethan Heinzen [ctb], Fernando Cagua [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "triebeard": { "Package": "triebeard", "Version": "0.4.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "642507a148b0dd9b5620177e0a044413" + "Type": "Package", + "Title": "'Radix' Trees in 'Rcpp'", + "Author": "Os Keyes [aut, cre], Drew Schmidt [aut], Yuuki Takano [cph]", + "Maintainer": "Os Keyes ", + "Description": "'Radix trees', or 'tries', are key-value data structures optimised for efficient lookups, similar in purpose to hash tables. 'triebeard' provides an implementation of 'radix trees' for use in R programming and in developing packages with 'Rcpp'.", + "License": "MIT + file LICENSE", + "LinkingTo": [ + "Rcpp" + ], + "Encoding": "UTF-8", + "Imports": [ + "Rcpp" + ], + "RoxygenNote": "7.1.2", + "Suggests": [ + "knitr", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "URL": "https://github.com/Ironholds/triebeard/", + "BugReports": "https://github.com/Ironholds/triebeard/issues", + "Date": "2023-03-04", + "NeedsCompilation": "yes", + "Repository": "CRAN" }, "urltools": { "Package": "urltools", - "Version": "1.7.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "e86a704261a105f4703f653e05defa3e" + "Version": "1.7.3.1", + "Source": "Repository", + "Type": "Package", + "Title": "Vectorised Tools for URL Handling and Parsing", + "Date": "2019-04-14", + "Authors@R": "c(person(given = \"Os\", family = \"Keyes\", role = c(\"aut\", \"cre\"), email = \"ironholds@gmail.com\"), person(given = \"Jay\", family = \"Jacobs\", role = \"aut\"), person(given = \"Drew\", family = \"Schmidt\", role = \"aut\"), person(given = \"Mark\", family = \"Greenaway\", role = \"ctb\"), person(given = \"Bob\", family = \"Rudis\", role = \"ctb\"), person(given = \"Alex\", family = \"Pinto\", role = \"ctb\"), person(given = \"Maryam\", family = \"Khezrzadeh\", role = \"ctb\"), person(given = \"Peter\", family = \"Meilstrup\", role = \"ctb\"), person(given = c(\"Adam\", \"M.\"), family = \"Costello\", role = \"cph\"), person(given = \"Jeff\", family = \"Bezanson\", role = \"cph\"), person(given = \"Peter\", family = \"Meilstrup\", role = \"ctb\"), person(given = \"Xueyuan\", family = \"Jiang\", role = \"ctb\"))", + "Description": "A toolkit for all URL-handling needs, including encoding and decoding, parsing, parameter extraction and modification. All functions are designed to be both fast and entirely vectorised. It is intended to be useful for people dealing with web-related datasets, such as server-side logs, although may be useful for other situations involving large sets of URLs.", + "License": "MIT + file LICENSE", + "LazyData": "TRUE", + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ + "Rcpp", + "methods", + "triebeard" + ], + "Suggests": [ + "testthat", + "knitr" + ], + "URL": "https://github.com/Ironholds/urltools/", + "BugReports": "https://github.com/Ironholds/urltools/issues", + "VignetteBuilder": "knitr", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 2.10)" + ], + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Author": "Os Keyes [aut, cre], Jay Jacobs [aut], Drew Schmidt [aut], Mark Greenaway [ctb], Bob Rudis [ctb], Alex Pinto [ctb], Maryam Khezrzadeh [ctb], Peter Meilstrup [ctb], Adam M. Costello [cph], Jeff Bezanson [cph], Peter Meilstrup [ctb], Xueyuan Jiang [ctb]", + "Maintainer": "Os Keyes " }, "utf8": { "Package": "utf8", - "Version": "1.2.4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "62b65c52671e6665f803ff02954446e9" + "Version": "1.2.6", + "Source": "Repository", + "Title": "Unicode Text Processing", + "Authors@R": "c(person(given = c(\"Patrick\", \"O.\"), family = \"Perry\", role = c(\"aut\", \"cph\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"cre\", email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Unicode, Inc.\", role = c(\"cph\", \"dtc\"), comment = \"Unicode Character Database\"))", + "Description": "Process and print 'UTF-8' encoded international text (Unicode). Input, validate, normalize, encode, format, and display.", + "License": "Apache License (== 2.0) | file LICENSE", + "URL": "https://krlmlr.github.io/utf8/, https://github.com/krlmlr/utf8", + "BugReports": "https://github.com/krlmlr/utf8/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "cli", + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" + ], + "VignetteBuilder": "knitr, rmarkdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "yes", + "Author": "Patrick O. Perry [aut, cph], Kirill M\u00fcller [cre] (ORCID: ), Unicode, Inc. [cph, dtc] (Unicode Character Database)", + "Maintainer": "Kirill M\u00fcller ", + "Repository": "CRAN" }, "vctrs": { "Package": "vctrs", - "Version": "0.6.5", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "c03fa420630029418f7e6da3667aac4a" + "Version": "0.7.3", + "Source": "Repository", + "Title": "Vector Helpers", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"data.table team\", role = \"cph\", comment = \"Radix sort based on data.table's forder() and their contribution to R's order()\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Defines new notions of prototype and size that are used to provide tools for consistent and well-founded type-coercion and size-recycling, and are in turn connected to ideas of type- and size-stability useful for analysing function interfaces.", + "License": "MIT + file LICENSE", + "URL": "https://vctrs.r-lib.org/, https://github.com/r-lib/vctrs", + "BugReports": "https://github.com/r-lib/vctrs/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "glue", + "lifecycle (>= 1.0.3)", + "rlang (>= 1.1.7)" + ], + "Suggests": [ + "bit64", + "covr", + "crayon", + "dplyr (>= 0.8.5)", + "generics", + "knitr", + "pillar (>= 1.4.4)", + "pkgdown (>= 2.0.1)", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble (>= 3.1.3)", + "waldo (>= 0.2.0)", + "withr", + "xml2", + "zeallot" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Encoding": "UTF-8", + "KeepSource": "true", + "Language": "en-GB", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Lionel Henry [aut], Davis Vaughan [aut, cre], data.table team [cph] (Radix sort based on data.table's forder() and their contribution to R's order()), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "CRAN" }, "withr": { "Package": "withr", - "Version": "3.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35" + "Version": "3.0.2", + "Source": "Repository", + "Title": "Run Code 'With' Temporarily Modified Global State", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"M\u00fcller\", , \"krlmlr+r@mailbox.org\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevinushey@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A set of functions to run code 'with' safely and temporarily modified global state. Many of these functions were originally a part of the 'devtools' package, this provides a simple package with limited dependencies to provide access to these functions.", + "License": "MIT + file LICENSE", + "URL": "https://withr.r-lib.org, https://github.com/r-lib/withr#readme", + "BugReports": "https://github.com/r-lib/withr/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "graphics", + "grDevices" + ], + "Suggests": [ + "callr", + "DBI", + "knitr", + "methods", + "rlang", + "rmarkdown (>= 2.12)", + "RSQLite", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Collate": "'aaa.R' 'collate.R' 'connection.R' 'db.R' 'defer-exit.R' 'standalone-defer.R' 'defer.R' 'devices.R' 'local_.R' 'with_.R' 'dir.R' 'env.R' 'file.R' 'language.R' 'libpaths.R' 'locale.R' 'makevars.R' 'namespace.R' 'options.R' 'par.R' 'path.R' 'rng.R' 'seed.R' 'wrap.R' 'sink.R' 'tempfile.R' 'timezone.R' 'torture.R' 'utils.R' 'with.R'", + "NeedsCompilation": "no", + "Author": "Jim Hester [aut], Lionel Henry [aut, cre], Kirill M\u00fcller [aut], Kevin Ushey [aut], Hadley Wickham [aut], Winston Chang [aut], Jennifer Bryan [ctb], Richard Cotton [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "xfun": { "Package": "xfun", - "Version": "0.46", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "00ce32f398db0415dde61abfef11300c" + "Version": "0.58", + "Source": "Repository", + "Type": "Package", + "Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Daijiang\", \"Li\", role = \"ctb\"), person(\"Xianying\", \"Tan\", role = \"ctb\"), person(\"Salim\", \"Br\u00fcggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person() )", + "Description": "Miscellaneous functions commonly used in other packages maintained by 'Yihui Xie'.", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "grDevices", + "stats", + "tools" + ], + "Suggests": [ + "testit", + "parallel", + "codetools", + "methods", + "rstudioapi", + "tinytex (>= 0.30)", + "mime", + "litedown (>= 0.6)", + "commonmark", + "knitr (>= 1.50)", + "remotes", + "pak", + "curl", + "xml2", + "jsonlite", + "magick", + "yaml", + "data.table", + "qs2" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/yihui/xfun", + "BugReports": "https://github.com/yihui/xfun/issues", + "Encoding": "UTF-8", + "VignetteBuilder": "litedown", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre, cph] (ORCID: , URL: https://yihui.org), Wush Wu [ctb], Daijiang Li [ctb], Xianying Tan [ctb], Salim Br\u00fcggemann [ctb] (ORCID: ), Christophe Dervieux [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "xml2": { "Package": "xml2", - "Version": "1.3.6", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61" + "Version": "1.5.2", + "Source": "Repository", + "Title": "Parse XML", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", email = \"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Foundation\", role = \"ctb\", comment = \"Copy of R-project homepage cached as example\") )", + "Description": "Bindings to 'libxml2' for working with XML data using a simple, consistent interface based on 'XPath' expressions. Also supports XML schema validation; for 'XSLT' transformations see the 'xslt' package.", + "License": "MIT + file LICENSE", + "URL": "https://xml2.r-lib.org, https://r-lib.r-universe.dev/xml2", + "BugReports": "https://github.com/r-lib/xml2/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "cli", + "methods", + "rlang (>= 1.1.0)" + ], + "Suggests": [ + "covr", + "curl", + "httr", + "knitr", + "mockery", + "rmarkdown", + "testthat (>= 3.2.0)", + "xslt" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "libxml2: libxml2-dev (deb), libxml2-devel (rpm)", + "Collate": "'S4.R' 'as_list.R' 'xml_parse.R' 'as_xml_document.R' 'classes.R' 'format.R' 'import-standalone-obj-type.R' 'import-standalone-purrr.R' 'import-standalone-types-check.R' 'init.R' 'nodeset_apply.R' 'paths.R' 'utils.R' 'xml2-package.R' 'xml_attr.R' 'xml_children.R' 'xml_document.R' 'xml_find.R' 'xml_missing.R' 'xml_modify.R' 'xml_name.R' 'xml_namespaces.R' 'xml_node.R' 'xml_nodeset.R' 'xml_path.R' 'xml_schema.R' 'xml_serialize.R' 'xml_structure.R' 'xml_text.R' 'xml_type.R' 'xml_url.R' 'xml_write.R' 'zzz.R'", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Jeroen Ooms [aut, cre], Posit Software, PBC [cph, fnd], R Foundation [ctb] (Copy of R-project homepage cached as example)", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "xtable": { "Package": "xtable", - "Version": "1.8-4", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "b8acdf8af494d9ec19ccb2481a9b11c2" + "Version": "1.8-8", + "Source": "Repository", + "Date": "2026-02-20", + "Title": "Export Tables to LaTeX or HTML", + "Authors@R": "c(person(\"David B.\", \"Dahl\", role=\"aut\"), person(\"David\", \"Scott\", role=c(\"aut\",\"cre\"), email=\"d.scott@auckland.ac.nz\"), person(\"Charles\", \"Roosen\", role=\"aut\"), person(\"Arni\", \"Magnusson\", role=\"aut\"), person(\"Jonathan\", \"Swinton\", role=\"aut\"), person(\"Ajay\", \"Shah\", role=\"ctb\"), person(\"Arne\", \"Henningsen\", role=\"ctb\"), person(\"Benno\", \"Puetz\", role=\"ctb\"), person(\"Bernhard\", \"Pfaff\", role=\"ctb\"), person(\"Claudio\", \"Agostinelli\", role=\"ctb\"), person(\"Claudius\", \"Loehnert\", role=\"ctb\"), person(\"David\", \"Mitchell\", role=\"ctb\"), person(\"David\", \"Whiting\", role=\"ctb\"), person(\"Fernando da\", \"Rosa\", role=\"ctb\"), person(\"Guido\", \"Gay\", role=\"ctb\"), person(\"Guido\", \"Schulz\", role=\"ctb\"), person(\"Ian\", \"Fellows\", role=\"ctb\"), person(\"Jeff\", \"Laake\", role=\"ctb\"), person(\"John\", \"Walker\", role=\"ctb\"), person(\"Jun\", \"Yan\", role=\"ctb\"), person(\"Liviu\", \"Andronic\", role=\"ctb\"), person(\"Markus\", \"Loecher\", role=\"ctb\"), person(\"Martin\", \"Gubri\", role=\"ctb\"), person(\"Matthieu\", \"Stigler\", role=\"ctb\"), person(\"Robert\", \"Castelo\", role=\"ctb\"), person(\"Seth\", \"Falcon\", role=\"ctb\"), person(\"Stefan\", \"Edwards\", role=\"ctb\"), person(\"Sven\", \"Garbade\", role=\"ctb\"), person(\"Uwe\", \"Ligges\", role=\"ctb\"))", + "Maintainer": "David Scott ", + "Imports": [ + "stats", + "utils", + "methods" + ], + "Suggests": [ + "knitr", + "zoo", + "survival", + "glue", + "tinytex" + ], + "VignetteBuilder": "knitr", + "Description": "Coerce data to LaTeX and HTML tables.", + "URL": "http://xtable.r-forge.r-project.org/", + "Depends": [ + "R (>= 2.10.0)" + ], + "License": "GPL (>= 2)", + "Repository": "CRAN", + "NeedsCompilation": "no", + "Author": "David B. Dahl [aut], David Scott [aut, cre], Charles Roosen [aut], Arni Magnusson [aut], Jonathan Swinton [aut], Ajay Shah [ctb], Arne Henningsen [ctb], Benno Puetz [ctb], Bernhard Pfaff [ctb], Claudio Agostinelli [ctb], Claudius Loehnert [ctb], David Mitchell [ctb], David Whiting [ctb], Fernando da Rosa [ctb], Guido Gay [ctb], Guido Schulz [ctb], Ian Fellows [ctb], Jeff Laake [ctb], John Walker [ctb], Jun Yan [ctb], Liviu Andronic [ctb], Markus Loecher [ctb], Martin Gubri [ctb], Matthieu Stigler [ctb], Robert Castelo [ctb], Seth Falcon [ctb], Stefan Edwards [ctb], Sven Garbade [ctb], Uwe Ligges [ctb]" }, "yaml": { "Package": "yaml", - "Version": "2.3.10", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "51dab85c6c98e50a18d7551e9d49f76c" + "Version": "2.3.12", + "Source": "Repository", + "Type": "Package", + "Title": "Methods to Convert R Data to YAML and Back", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"cre\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Shawn\", \"Garbett\", , \"shawn.garbett@vumc.org\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4079-5621\")), person(\"Jeremy\", \"Stephens\", role = c(\"aut\", \"ctb\")), person(\"Kirill\", \"Simonov\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Zhuoer\", \"Dong\", role = \"ctb\"), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"reikoch\", role = \"ctb\"), person(\"Will\", \"Beasley\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5613-5006\")), person(\"Brendan\", \"O'Connor\", role = \"ctb\"), person(\"Michael\", \"Quinn\", role = \"ctb\"), person(\"Charlie\", \"Gao\", role = \"ctb\"), person(c(\"Gregory\", \"R.\"), \"Warnes\", role = \"ctb\"), person(c(\"Zhian\", \"N.\"), \"Kamvar\", role = \"ctb\") )", + "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", + "License": "BSD_3_clause + file LICENSE", + "URL": "https://yaml.r-lib.org, https://github.com/r-lib/yaml/", + "BugReports": "https://github.com/r-lib/yaml/issues", + "Suggests": [ + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [cre] (ORCID: ), Shawn Garbett [ctb] (ORCID: ), Jeremy Stephens [aut, ctb], Kirill Simonov [aut], Yihui Xie [ctb] (ORCID: ), Zhuoer Dong [ctb], Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb] (ORCID: ), Brendan O'Connor [ctb], Michael Quinn [ctb], Charlie Gao [ctb], Gregory R. Warnes [ctb], Zhian N. Kamvar [ctb]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" } } -} +} \ No newline at end of file diff --git a/server/workers/metrics/requirements.txt b/server/workers/metrics/requirements.txt index 7679debf7..4936eb3ad 100644 --- a/server/workers/metrics/requirements.txt +++ b/server/workers/metrics/requirements.txt @@ -1,21 +1,8 @@ -asn1crypto==0.24.0 -async-timeout==4.0.2 -cryptography==2.1.4 -idna==2.6 -importlib-metadata==4.8.3 -keyring==10.6.0 -keyrings.alt==3.0 -Levenshtein==0.21.1 -numpy==1.19.5 -packaging==21.3 -pandas==1.1.5 -pycrypto==2.6.1 -pyparsing==3.1.1 -python-dateutil==2.8.2 -pytz==2023.3.post1 -pyxdg==0.25 -redis==4.3.6 -SecretStorage==2.3.1 -six==1.11.0 -typing-extensions==4.1.1 -zipp==3.6.0 +Levenshtein==0.25.1 +numpy==1.26.4 +pandas==2.2.2 +python-dateutil==2.9.0.post0 +pytz==2024.1 +redis==5.0.8 +six==1.16.0 +typing-extensions==4.12.2 diff --git a/server/workers/persistence/Dockerfile b/server/workers/persistence/Dockerfile index d339b08d7..2462af67a 100644 --- a/server/workers/persistence/Dockerfile +++ b/server/workers/persistence/Dockerfile @@ -9,7 +9,6 @@ WORKDIR /persistence COPY workers/persistence/requirements.txt . RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt -RUN pip install git+https://github.com/python-restx/flask-restx COPY workers/common ../common COPY workers/persistence/requirements-e.txt ./ diff --git a/server/workers/persistence/requirements.txt b/server/workers/persistence/requirements.txt index 1d31856d0..a18553f5f 100644 --- a/server/workers/persistence/requirements.txt +++ b/server/workers/persistence/requirements.txt @@ -19,4 +19,4 @@ SQLAlchemy-Utils==0.41.1 typing_extensions==4.7.1 Werkzeug==3.0.1 zipp==3.15.0 -flask-restx==1.3.0 \ No newline at end of file +flask-restx==1.3.2 \ No newline at end of file diff --git a/server/workers/persistence/tests/requirements.txt b/server/workers/persistence/tests/requirements.txt index 24b68d63d..9e573b089 100644 --- a/server/workers/persistence/tests/requirements.txt +++ b/server/workers/persistence/tests/requirements.txt @@ -1,6 +1,6 @@ pytest pytest-mock flask -flask_restx +flask_restx==1.3.2 sqlalchemy psycopg2 \ No newline at end of file diff --git a/server/workers/tests/Dockerfile.tests b/server/workers/tests/Dockerfile.tests index 351531b14..6e61b2d43 100644 --- a/server/workers/tests/Dockerfile.tests +++ b/server/workers/tests/Dockerfile.tests @@ -8,5 +8,5 @@ RUN apt-get install -y libpq-dev WORKDIR /app -RUN pip install git+https://github.com/python-restx/flask-restx +RUN pip install git+https://github.com/python-restx/flask-restx@1.3.2 RUN pip install pytest requests sqlalchemy sqlalchemy-utils psycopg2-binary \ No newline at end of file diff --git a/vis/js/utils/e2eVisualisationLoader.ts b/vis/js/utils/e2eVisualisationLoader.ts new file mode 100644 index 000000000..b5550c146 --- /dev/null +++ b/vis/js/utils/e2eVisualisationLoader.ts @@ -0,0 +1,16 @@ +import { expect, Page } from "@playwright/test"; + +export const prepareVisualisation = async (page: Page, url: string) => { + await page.goto(url); + + const contextLine = page.getByTestId("context"); + await expect(contextLine).toBeVisible(); + + await expect + .poll( + async () => + ((await contextLine.textContent()) ?? "").replace(/\s+/g, " ").trim(), + { timeout: 5 * 60 * 1000, intervals: [500, 1000, 2000, 5000] }, + ) + .not.toBe(""); +}; diff --git a/vis/js/utils/e2eWaitForVisualisationCreation.ts b/vis/js/utils/e2eWaitForVisualisationCreation.ts new file mode 100644 index 000000000..a4b82a3e8 --- /dev/null +++ b/vis/js/utils/e2eWaitForVisualisationCreation.ts @@ -0,0 +1,14 @@ +import { expect, Page } from "@playwright/test"; + +export const waitForVisualisationCreation = async (page: Page) => { + const contextLine = page.getByTestId("context"); + await expect(contextLine).toBeVisible(); + + await expect + .poll( + async () => + ((await contextLine.textContent()) ?? "").replace(/\s+/g, " ").trim(), + { timeout: 5 * 60 * 1000, intervals: [500, 1000, 2000, 5000] }, + ) + .not.toBe(""); +}; diff --git a/vis/js/utils/transition.ts b/vis/js/utils/transition.ts index a27b404d6..5d7b01c61 100644 --- a/vis/js/utils/transition.ts +++ b/vis/js/utils/transition.ts @@ -2,15 +2,16 @@ import { transition } from "d3-transition"; import { easePolyInOut } from "d3-ease"; /** - * Returns d3 transition object that is passed as a parameter + * Returns d3 transition object that is passed as a parameter * to each component transition. - * + * * @param {Function} callback callback triggered at the end */ export const createTransition = (duration: number, callback: () => void) => { const newTransition = transition() .duration(duration) .ease(easePolyInOut.exponent(3)); + newTransition.on("end", callback); return newTransition; }; diff --git a/vis/test/component/templates/list-entry/Abstract.test.tsx b/vis/test/component/templates/list-entry/Abstract.test.tsx new file mode 100644 index 000000000..eae1de361 --- /dev/null +++ b/vis/test/component/templates/list-entry/Abstract.test.tsx @@ -0,0 +1,62 @@ +import { render } from "@testing-library/react"; +import { Localization } from "../../../../js/i18n/localization"; +import LocalizationProvider from "../../../../js/components/LocalizationProvider"; +import Abstract from "../../../../js/templates/listentry/Abstract"; +import React from "react"; +import { Provider } from "react-redux"; +import configureStore from "redux-mock-store"; + +const mockStore = configureStore([]); + +describe("Abstract in the ListEntry component", () => { + const setup = (isSelectedPaper: boolean, abstractText?: string) => { + const LOCALIZATION_OBJECT_MOCK: Pick = { + default_abstract: "No abstract available", + }; + + const STORE_DATA_MOCK = { + selectedPaper: isSelectedPaper, + list: { searchValue: "" }, + query: { parsedTerms: "" }, + }; + + const STORE_MOCK = mockStore(STORE_DATA_MOCK); + + const { container } = render( + + + + + , + ); + + return container; + }; + + it("Shows abstract text if it is presented", () => { + const container = setup(true, "Some cool abstract text."); + + const paragraphWithAbstract = container.querySelector("#list_abstract"); + expect(paragraphWithAbstract).toBeInTheDocument(); + expect(paragraphWithAbstract).toHaveTextContent("Some cool abstract text."); + }); + + it("Shows abstract text with additional styling if it is presented and document is not selected", () => { + const container = setup(false, "Some cool abstract text."); + + const paragraphWithAbstract = container.querySelector("#list_abstract"); + expect(paragraphWithAbstract).toBeInTheDocument(); + expect(paragraphWithAbstract).toHaveClass("short"); + expect(paragraphWithAbstract).toHaveTextContent("Some cool abstract text."); + }); + + it("Shows template text from localization if abstract is not presented", () => { + const container = setup(false, undefined); + + const paragraphWithAbstract = container.querySelector("#list_abstract"); + expect(paragraphWithAbstract).toBeInTheDocument(); + expect(paragraphWithAbstract).toHaveTextContent("No abstract available"); + }); +}); diff --git a/vis/test/component/templates/list-entry/Citations.test.tsx b/vis/test/component/templates/list-entry/Citations.test.tsx new file mode 100644 index 000000000..375121cd7 --- /dev/null +++ b/vis/test/component/templates/list-entry/Citations.test.tsx @@ -0,0 +1,32 @@ +import { render } from "@testing-library/react"; +import Citations from "../../../../js/templates/listentry/Citations"; +import React from "react"; + +describe("Citations in the ListEntry component", () => { + const setup = (numberOfCitation: number, labelOfCitations: string) => { + const { container } = render( + , + ); + + return container; + }; + + it("Shows citations in the correct order (numberOfCitation and labelOfCitations)", () => { + const NUMBER_OF_CITATIONS = 15; + const LABEL_OF_CITATIONS = "citations"; + + const container = setup(NUMBER_OF_CITATIONS, LABEL_OF_CITATIONS); + + const citationsContainer = container.querySelector(".list_readers"); + expect(citationsContainer).toBeInTheDocument(); + + const spanWithLabelOfCitations = citationsContainer?.querySelector( + ".list_readers_entity", + ); + expect(spanWithLabelOfCitations).toBeInTheDocument(); + + expect(citationsContainer).toHaveTextContent( + `${NUMBER_OF_CITATIONS} ${LABEL_OF_CITATIONS}`, + ); + }); +}); diff --git a/vis/test/component/templates/list-entry/Keywords.test.tsx b/vis/test/component/templates/list-entry/Keywords.test.tsx new file mode 100644 index 000000000..421ba7c39 --- /dev/null +++ b/vis/test/component/templates/list-entry/Keywords.test.tsx @@ -0,0 +1,69 @@ +import { render } from "@testing-library/react"; +import Keywords from "../../../../js/templates/listentry/Keywords"; +import React from "react"; +import LocalizationProvider from "../../../../js/components/LocalizationProvider"; +import { Localization } from "../../../../js/i18n/localization"; +import { Provider } from "react-redux"; +import configureStore from "redux-mock-store"; + +const mockStore = configureStore([]); + +describe("Keywords in the ListEntry component", () => { + const setup = (keywords: string, query: string) => { + const LOCALIZATION_OBJECT_MOCK = { + keywords: "Keywords", + } as Localization; + + const STORE_DATA_MOCK = { + list: { searchValue: "" }, + query: { + parsedTerms: [query], + highlightTerms: true, + useLookBehind: true, + }, + }; + + const STORE_MOCK = mockStore(STORE_DATA_MOCK); + + const { container } = render( + + + {keywords} + + , + ); + + return container; + }; + + it("Shows keywords", () => { + const KEYWORDS_TEXT = "Higher education is a distinct context..."; + const HIGHLIGHTED_WORD = ""; + + const container = setup(KEYWORDS_TEXT, HIGHLIGHTED_WORD); + + const keywordsContainer = container.querySelector(".list_row"); + expect(keywordsContainer).toBeInTheDocument(); + + const keywordsLabel = keywordsContainer?.firstChild; + expect(keywordsLabel).toHaveTextContent("Keywords:"); + + const keywordsContent = keywordsContainer?.lastChild; + expect(keywordsContent).toHaveTextContent(KEYWORDS_TEXT); + }); + + it("Shows keywords and highlight query words in them", () => { + const KEYWORDS_TEXT = "Higher education is a distinct context..."; + const HIGHLIGHTED_WORD = "education"; + + const container = setup(KEYWORDS_TEXT, HIGHLIGHTED_WORD); + + const keywordsContainer = container.querySelector(".list_row"); + expect(keywordsContainer).toBeInTheDocument(); + + const highlightedWord = keywordsContainer?.querySelector( + ".query_term_highlight ", + ); + expect(highlightedWord).toBeInTheDocument(); + }); +}); diff --git a/vis/test/component/templates/list-entry/Link.test.tsx b/vis/test/component/templates/list-entry/Link.test.tsx new file mode 100644 index 000000000..9ad43931c --- /dev/null +++ b/vis/test/component/templates/list-entry/Link.test.tsx @@ -0,0 +1,58 @@ +import { render } from "@testing-library/react"; +import Link from "../../../../js/templates/listentry/Link"; +import React from "react"; +import LocalizationProvider from "../../../../js/components/LocalizationProvider"; +import { Localization } from "../../../../js/i18n/localization"; + +describe("Link in the ListEntry component", () => { + const setup = (isDoi: boolean, url?: string | null) => { + const LOCALIZATION_OBJECT_MOCK = { + link: "link", + notAvailable: "n/a", + } as Localization; + + const { container } = render( + + , + , + ); + + return container; + }; + + it('Link named as "doi"', () => { + const container = setup(true, ""); + + expect(container).toHaveTextContent("doi"); + }); + + it('Link named as "link"', () => { + const container = setup(false, ""); + + expect(container).toHaveTextContent("link"); + }); + + it('Link named as "link" and displays url correctly', () => { + const container = setup(false, "https://some.url.com/"); + + expect(container).toHaveTextContent("[link]: https://some.url.com/"); + }); + + it('Link named as "doi" and displays url correctly', () => { + const container = setup(true, "https://some.url.com/"); + + expect(container).toHaveTextContent("[doi]: https://some.url.com/"); + }); + + it('Link named as "doi" and displays "not available" message', () => { + const container = setup(true, undefined); + + expect(container).toHaveTextContent("[doi]: n/a"); + }); + + it('Link named as "link" and displays "not available" message', () => { + const container = setup(false, undefined); + + expect(container).toHaveTextContent("[link]: n/a"); + }); +}); diff --git a/vis/test/component/templates/list-entry/OrcidMetrics.test.tsx b/vis/test/component/templates/list-entry/OrcidMetrics.test.tsx new file mode 100644 index 000000000..6b3146845 --- /dev/null +++ b/vis/test/component/templates/list-entry/OrcidMetrics.test.tsx @@ -0,0 +1,186 @@ +// @ts-nocheck +import { render } from "@testing-library/react"; +import React from "react"; + +import OrcidMetrics from "../../../../js/templates/listentry/OrcidMetrics"; + +describe("OrcidMetrics in the ListEntry component", () => { + type PossibleMetricsTypes = null | undefined | number | string; + + const setup = ( + citations: PossibleMetricsTypes, + socialMedia: PossibleMetricsTypes, + referencesOutsideAcademia: PossibleMetricsTypes, + baseUnit: null | string, + ) => { + const { container } = render( + , + ); + + return container; + }; + + describe("Citations", () => { + it('Showing "n/a" if citations are not defined', () => { + const container = setup(undefined, "n/a", null, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[0]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("n/a"); + }); + + it('Showing "n/a" if citations are equals to null', () => { + const container = setup(null, "n/a", null, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[0]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("n/a"); + }); + + it("Shows citations when they are defined and presented as number", () => { + const container = setup(100, "n/a", null, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[0]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("100"); + }); + + it("Shows citations when they are defined and presented as string", () => { + const container = setup("100", "n/a", null, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[0]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("100"); + }); + + it('Apply additional styles if "citations" is a base unit', () => { + const container = setup("100", "n/a", null, "citations"); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[0]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("100"); + expect(spanWithCitationsMetricSpan).toHaveClass("scaled-metric"); + }); + }); + + describe("Social media", () => { + it('Showing "n/a" if social media metrics are not defined', () => { + const container = setup(100, undefined, null, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[1]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("n/a"); + }); + + it('Showing "n/a" if social media metrics are equals to null', () => { + const container = setup(100, null, null, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[1]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("n/a"); + }); + + it("Shows social media metrics if they are defined and presented as number", () => { + const container = setup(100, 101, null, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[1]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("101"); + }); + + it("Shows social media metrics if they are defined and presented as string", () => { + const container = setup(100, "101", null, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[1]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("101"); + }); + + it('Apply additional styles if "social" is a base unit', () => { + const container = setup(100, "101", null, "social"); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[1]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("101"); + expect(spanWithCitationsMetricSpan).toHaveClass("scaled-metric"); + }); + }); + + describe("References outside academia", () => { + it('Showing "n/a" if references outside academia are not defined', () => { + const container = setup(100, 101, undefined, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[2]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("n/a"); + }); + + it('Showing "n/a" if references outside academia are equals to null', () => { + const container = setup(100, 101, null, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[2]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("n/a"); + }); + + it("Shows references outside academia metrics if they are defined and presented as number", () => { + const container = setup(100, 101, 102, null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[2]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("102"); + }); + + it("Shows references outside academia metrics if they are defined and presented as string", () => { + const container = setup(100, 101, "102", null); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[2]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("102"); + }); + + it('Apply additional styles if "references" is a base unit', () => { + const container = setup(100, 101, 102, "references"); + + const spansWithMetrics = container.querySelectorAll(".list_metrics_item"); + const spanWithCitationsMetricSpan = spansWithMetrics[2]; + + expect(spanWithCitationsMetricSpan).toBeInTheDocument(); + expect(spanWithCitationsMetricSpan).toHaveTextContent("102"); + expect(spanWithCitationsMetricSpan).toHaveClass("scaled-metric"); + }); + }); +}); diff --git a/vis/test/utils/paper.test.js b/vis/test/utils/paper.test.ts similarity index 100% rename from vis/test/utils/paper.test.js rename to vis/test/utils/paper.test.ts diff --git a/vis/test/utils/scale.test.ts b/vis/test/utils/scale.test.ts new file mode 100644 index 000000000..103a253eb --- /dev/null +++ b/vis/test/utils/scale.test.ts @@ -0,0 +1,99 @@ +import { + getCoordsScale, + getDiameterScale, + getInitialCoordsScale, + getRadiusScale, + getResizedScale, + getZoomScale, +} from "../../js/utils/scale"; + +describe("Scale functions", () => { + describe("getCoordsScale", () => { + it("Scale coordinates correctly", () => { + const scaleFn = getCoordsScale([0, 100], 500, { + maxAreaSize: 50, + referenceSize: 500, + bubbleMaxScale: 1, + }); + + const result = scaleFn(50); + + expect(typeof result).toBe("number"); + expect(result).toBeGreaterThan(0); + expect(result).toBeLessThan(500); + }); + }); + + describe("getRadiusScale", () => { + it("Scale radius correctly", () => { + const scaleFn = getRadiusScale([0, 10], 400, { + minAreaSize: 10, + maxAreaSize: 50, + referenceSize: 400, + bubbleMinScale: 1, + bubbleMaxScale: 2, + }); + + const small = scaleFn(0); + const big = scaleFn(10); + + expect(big).toBeGreaterThan(small); + }); + }); + + describe("getDiameterScale", () => { + it("Scale diameter correctly", () => { + const scaleFn = getDiameterScale([1, 5], 300, { + referenceSize: 300, + minDiameterSize: 10, + maxDiameterSize: 30, + paperMinScale: 1, + paperMaxScale: 2, + }); + + const small = scaleFn(1); + const big = scaleFn(5); + + expect(big).toBeGreaterThan(small); + }); + }); + + describe("getInitialCoordsScale", () => { + it("Scale initial coordinates correctly", () => { + const scaleFn = getInitialCoordsScale([0, 100], 200); + + expect(scaleFn(0)).toBeGreaterThan(0); + expect(scaleFn(100)).toBeLessThan(200); + }); + }); + + describe("getResizedScale", () => { + it("Resize coordinates from old size to new size", () => { + const scaleFn = getResizedScale(100, 200); + + expect(scaleFn(0)).toBe(0); + expect(scaleFn(100)).toBe(200); + expect(scaleFn(50)).toBe(100); + }); + }); + + describe("getZoomScale", () => { + it("Zoom coordinates correctly for bubbles", () => { + const scaleFn = getZoomScale(100, 50, 400, "bubble"); + const val = scaleFn(100); + + expect(typeof val).toBe("number"); + expect(val).toBeGreaterThan(0); + expect(val).toBeLessThan(400); + }); + + it("Zoom coordinates correctly for papers", () => { + const scaleFn = getZoomScale(200, 80, 500, "paper"); + const val = scaleFn(250); + + expect(typeof val).toBe("number"); + expect(val).toBeGreaterThan(0); + expect(val).toBeLessThan(500); + }); + }); +}); diff --git a/vis/test/utils/transition.test.ts b/vis/test/utils/transition.test.ts new file mode 100644 index 000000000..e97b1d23e --- /dev/null +++ b/vis/test/utils/transition.test.ts @@ -0,0 +1,57 @@ +import { describe, it, expect, vi } from "vitest"; + +vi.mock("d3-transition", () => { + const mockDuration = vi.fn().mockReturnThis(); + const mockEase = vi.fn().mockReturnThis(); + const mockOn = vi.fn().mockReturnThis(); + + const mockTransition = { + duration: mockDuration, + ease: mockEase, + on: mockOn, + }; + + return { + transition: vi.fn(() => mockTransition), + __esModule: true, + _mocks: { + mockTransition, + mockDuration, + mockEase, + mockOn, + }, + }; +}); + +vi.mock("d3-ease", () => { + const mockExponent = vi.fn(() => "mocked-easing-fn"); + return { + easePolyInOut: { exponent: mockExponent }, + __esModule: true, + _mocks: { + mockExponent, + }, + }; +}); + +import { createTransition } from "../../js/utils/transition"; + +describe("The createTransition function", async () => { + it("creates a transition with specified duration, easing and end callback", async () => { + const transitionModule = await import("d3-transition"); + const tMocks = (transitionModule as any)._mocks; + + const easeModule = await import("d3-ease"); + const eMocks = (easeModule as any)._mocks; + + const mockCallback = vi.fn(); + const result = createTransition(400, mockCallback); + + expect(transitionModule.transition).toHaveBeenCalled(); + expect(tMocks.mockDuration).toHaveBeenCalledWith(400); + expect(eMocks.mockExponent).toHaveBeenCalledWith(3); + expect(tMocks.mockEase).toHaveBeenCalledWith("mocked-easing-fn"); + expect(tMocks.mockOn).toHaveBeenCalledWith("end", mockCallback); + expect(result).toEqual(tMocks.mockTransition); + }); +}); diff --git a/vis/test/utils/unescapeHTMLentities.test.ts b/vis/test/utils/unescapeHTMLentities.test.ts new file mode 100644 index 000000000..c68f2cb93 --- /dev/null +++ b/vis/test/utils/unescapeHTMLentities.test.ts @@ -0,0 +1,39 @@ +import { describe } from "vitest"; +import { unescapeHTML } from "../../js/utils/unescapeHTMLentities"; + +describe("Unescape HTML entities function", () => { + it("Single HTML entities decoded", () => { + expect(unescapeHTML("&")).toBe("&"); + expect(unescapeHTML("<")).toBe("<"); + expect(unescapeHTML(">")).toBe(">"); + expect(unescapeHTML(""")).toBe('"'); + expect(unescapeHTML(""")).toBe('"'); + expect(unescapeHTML("'")).toBe("'"); + expect(unescapeHTML("/")).toBe("/"); + expect(unescapeHTML("`")).toBe("`"); + expect(unescapeHTML("=")).toBe("="); + }); + + it("Multiple entities in a single string decoded", () => { + const input = + "<div class="test">Hello & Welcome/</div>"; + const expected = '
Hello & Welcome/
'; + expect(unescapeHTML(input)).toBe(expected); + }); + + it("String unchanged if no entities present", () => { + const input = "Plain text with no HTML entities"; + expect(unescapeHTML(input)).toBe(input); + }); + + it("Empty string input handled", () => { + expect(unescapeHTML("")).toBe(""); + }); + + it("Non-string input converted to string", () => { + expect(unescapeHTML(123 as any as string)).toBe("123"); + expect(unescapeHTML(null as any)).toBe("null"); + expect(unescapeHTML(undefined as any)).toBe("undefined"); + expect(unescapeHTML(true as any)).toBe("true"); + }); +}); diff --git a/vite.config.ts b/vite.config.ts index 9325d774c..2607e0549 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from "vitest/config"; +import { configDefaults, defineConfig } from "vitest/config"; import react from "@vitejs/plugin-react"; import inject from "@rollup/plugin-inject"; @@ -11,7 +11,6 @@ export default defineConfig({ }), ], assetsInclude: ["**/*.csl"], - resolve: { alias: { "@": "/vis/", @@ -26,5 +25,6 @@ export default defineConfig({ globals: true, environment: "jsdom", setupFiles: "./vis/test/setupTests.js", + exclude: [...configDefaults.exclude, "e2e/**"], }, });