diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index a22c05c822..eaaa831c5f 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -32,13 +32,8 @@ jobs: strategy: fail-fast: false matrix: - # Connect Server versions - tests exclude @pcc tags - # Simplified to reduce CI time: preview, release, one recent, one old connect-version: - - "preview" # Nightly builds of Connect - catch regressions early - "release" # Latest stable release + PCC cloud tests - - "2025.03.0" # Recent stable version - - "2023.03.0" # Oldest supported version env: # Debug mode input from workflow_dispatch or workflow_call @@ -210,9 +205,6 @@ jobs: # Clean up any static TOML files before tests docker exec publisher-e2e.code-server rm -f /home/coder/workspace/static*.toml || true - # Run Cypress tests - # - For "release": run ALL tests (including @pcc cloud tests) - # - For other versions: exclude @pcc tests (cloud tests only run once on release) - name: Run Cypress tests (${{ matrix.connect-version }}) id: run_tests uses: posit-dev/with-connect@main @@ -222,13 +214,7 @@ jobs: port: 3939 command: | cd test/e2e - if [ "${{ matrix.connect-version }}" = "release" ]; then - # Run all tests (including @pcc cloud tests) - CYPRESS_BOOTSTRAP_ADMIN_API_KEY=$CONNECT_API_KEY npx cypress run --headless --browser chrome - else - # Exclude @pcc cloud tests for non-release versions - CYPRESS_BOOTSTRAP_ADMIN_API_KEY=$CONNECT_API_KEY npx cypress run --headless --browser chrome --env grepFilterSpecs=true,grepOmitFiltered=true,grepTags=-@pcc - fi + CYPRESS_BOOTSTRAP_ADMIN_API_KEY=$CONNECT_API_KEY npx cypress run --headless --browser chrome env: CONNECT_CLOUD_ENV: staging CI: true diff --git a/extensions/vscode/webviews/homeView/src/stores/home.test.ts b/extensions/vscode/webviews/homeView/src/stores/home.test.ts index 09d83066a9..57584b8b6f 100644 --- a/extensions/vscode/webviews/homeView/src/stores/home.test.ts +++ b/extensions/vscode/webviews/homeView/src/stores/home.test.ts @@ -2,8 +2,100 @@ import { setActivePinia, createPinia } from "pinia"; import { beforeEach, describe, expect, test, vi } from "vitest"; import { useHomeStore } from "src/stores/home"; +import type { + Configuration, + ConfigurationDetails, + ConfigurationError, +} from "../../../../src/api/types/configurations"; +import { ContentType } from "../../../../src/api/types/configurations"; +import { ProductType } from "../../../../src/api/types/contentRecords"; +import type { PreContentRecord } from "../../../../src/api/types/contentRecords"; +import type { Credential } from "../../../../src/api/types/credentials"; +import { + ContentRecordState, + ServerType, +} from "../../../../src/api/types/contentRecords"; +import type { + AgentErrorInvalidTOML, + AgentErrorTypeUnknown, +} from "../../../../src/api/types/error"; +import type { ErrorCode } from "../../../../src/utils/errorTypes"; -vi.mock(import("src/vscode")); +vi.mock("src/vscode", () => { + const postMessage = vi.fn(); + const vscodeAPI = vi.fn(() => ({ + postMessage: postMessage, + })); + return { vscodeAPI }; +}); + +// Helper to create a minimal PreContentRecord for testing +function makeContentRecord( + overrides: Partial = {}, +): PreContentRecord { + return { + $schema: "", + serverType: ServerType.CONNECT, + serverUrl: "https://connect.example.com", + saveName: "test-deployment", + createdAt: "", + dismissedAt: "", + configurationName: "default", + type: ContentType.HTML, + deploymentError: null, + connectCloud: null, + deploymentName: "test-deployment", + deploymentPath: "/path/to/deployment.toml", + projectDir: ".", + state: ContentRecordState.NEW, + ...overrides, + }; +} + +// Helper to create a valid Configuration +function makeConfiguration( + overrides: Omit, "configuration"> & { + configuration?: Partial; + } = {}, +): Configuration { + const { configuration: configOverrides, ...rest } = overrides; + return { + configurationName: "default", + configurationPath: "/path/to/config.toml", + configurationRelPath: ".posit/publish/default.toml", + projectDir: ".", + configuration: { + $schema: "", + productType: ProductType.CONNECT, + type: ContentType.HTML, + entrypoint: "index.html", + title: "My App", + files: ["/index.html"], + validate: true, + ...configOverrides, + }, + ...rest, + }; +} + +// Helper to create a ConfigurationError +function makeConfigurationError( + overrides: Partial = {}, +): ConfigurationError { + return { + configurationName: "default", + configurationPath: "/path/to/config.toml", + configurationRelPath: ".posit/publish/default.toml", + projectDir: ".", + error: { + code: "unknown" as ErrorCode, + msg: "some error", + operation: "read", + data: {}, + }, + ...overrides, + }; +} describe("Home Store", () => { beforeEach(() => { @@ -15,4 +107,189 @@ describe("Home Store", () => { const home = useHomeStore(); expect(home.showDisabledOverlay).toBe(false); }); + + describe("config.active error states", () => { + test("isMissing is true when config file is not found", () => { + const home = useHomeStore(); + + // Set up a content record that references a config name + const contentRecord = makeContentRecord({ + configurationName: "deleted-config", + }); + home.contentRecords.push(contentRecord); + home.selectedContentRecord = contentRecord; + + // Don't add any matching configuration or error — simulates deleted file + expect(home.config.active.isMissing).toBe(true); + expect(home.config.active.isAlertActive).toBe(true); + }); + + test("isMissing is false when config exists", () => { + const home = useHomeStore(); + + const contentRecord = makeContentRecord({ + configurationName: "default", + }); + home.contentRecords.push(contentRecord); + home.selectedContentRecord = contentRecord; + + // Add matching configuration + home.configurations.push(makeConfiguration()); + + expect(home.config.active.isMissing).toBe(false); + }); + + test("isTOMLError is true for invalidTOML config errors", () => { + const home = useHomeStore(); + + const contentRecord = makeContentRecord({ + configurationName: "broken-config", + }); + home.contentRecords.push(contentRecord); + home.selectedContentRecord = contentRecord; + + // Add a configuration error with invalidTOML code + const error: AgentErrorInvalidTOML = { + code: "invalidTOML" as ErrorCode, + msg: "invalid TOML syntax", + operation: "read", + data: { + problem: "unexpected character", + file: "default.toml", + line: 5, + column: 10, + }, + }; + home.configurationsInError.push( + makeConfigurationError({ + configurationName: "broken-config", + error, + }), + ); + + expect(home.config.active.isTOMLError).toBe(true); + expect(home.config.active.isAlertActive).toBe(true); + }); + + test("isTOMLError is true for unknownTOMLKey config errors", () => { + const home = useHomeStore(); + + const contentRecord = makeContentRecord({ + configurationName: "broken-config", + }); + home.contentRecords.push(contentRecord); + home.selectedContentRecord = contentRecord; + + const error: AgentErrorInvalidTOML = { + code: "unknownTOMLKey" as ErrorCode, + msg: "invalidParam: not allowed", + operation: "read", + data: { + problem: "invalidParam: not allowed", + file: "default.toml", + line: 3, + column: 1, + }, + }; + home.configurationsInError.push( + makeConfigurationError({ + configurationName: "broken-config", + error, + }), + ); + + expect(home.config.active.isTOMLError).toBe(true); + }); + + test("isUnknownError is true for non-TOML agent errors", () => { + const home = useHomeStore(); + + const contentRecord = makeContentRecord({ + configurationName: "error-config", + }); + home.contentRecords.push(contentRecord); + home.selectedContentRecord = contentRecord; + + const error: AgentErrorTypeUnknown = { + code: "unknown" as ErrorCode, + msg: "something went wrong", + operation: "validate", + data: { detail: "unexpected" }, + }; + home.configurationsInError.push( + makeConfigurationError({ + configurationName: "error-config", + error, + }), + ); + + expect(home.config.active.isUnknownError).toBe(true); + expect(home.config.active.isTOMLError).toBe(false); + expect(home.config.active.isAlertActive).toBe(true); + }); + + test("isUnknownType is true when config type is unknown", () => { + const home = useHomeStore(); + + const contentRecord = makeContentRecord({ + configurationName: "unknown-type", + }); + home.contentRecords.push(contentRecord); + home.selectedContentRecord = contentRecord; + + home.configurations.push( + makeConfiguration({ + configurationName: "unknown-type", + configuration: { + type: ContentType.UNKNOWN, + entrypoint: "unknown", + title: "Unknown", + }, + }), + ); + + expect(home.config.active.isUnknownType).toBe(true); + }); + + test("isEntryMissing is true when content record has no config name", () => { + const home = useHomeStore(); + + const contentRecord = makeContentRecord({ + configurationName: "", + }); + home.contentRecords.push(contentRecord); + home.selectedContentRecord = contentRecord; + + expect(home.config.active.isEntryMissing).toBe(true); + expect(home.config.active.isAlertActive).toBe(true); + }); + + test("no error states are active for a valid configuration", () => { + const home = useHomeStore(); + + const contentRecord = makeContentRecord(); + home.contentRecords.push(contentRecord); + home.selectedContentRecord = contentRecord; + home.configurations.push(makeConfiguration()); + + // Add a credential so isCredentialMissing is also false + home.credentials.push({ + guid: "", + name: "test-cred", + url: "https://connect.example.com", + apiKey: "", + accountId: "", + accountName: "", + refreshToken: "", + accessToken: "", + serverType: ServerType.CONNECT, + } as Credential); + + expect(home.config.active.isMissing).toBe(false); + expect(home.config.active.isTOMLError).toBe(false); + expect(home.config.active.isUnknownError).toBe(false); + expect(home.config.active.isUnknownType).toBe(false); + expect(home.config.active.isEntryMissing).toBe(false); + }); + }); }); diff --git a/internal/bundles/bundle_test.go b/internal/bundles/bundle_test.go index 0fa980d094..5cb0eb3a7e 100644 --- a/internal/bundles/bundle_test.go +++ b/internal/bundles/bundle_test.go @@ -348,6 +348,105 @@ func (s *BundlerSuite) TestMultipleCallsFromDirectory() { }, s.getTarFileNames(dest)) } +func (s *BundlerSuite) TestCreateBundleFromSubdirectory() { + // Simulate a project in a subdirectory of the workspace. + // The bundler should only include files from the subdirectory + // with paths relative to that subdirectory. + // Uses real OS directories because CreateBundle calls os.Chdir. + osFs := afero.NewOsFs() + tempDir, err := os.MkdirTemp("", "bundle_subdir_test_*") + s.Nil(err) + defer os.RemoveAll(tempDir) + + workspace := util.AbsolutePath{Path: util.NewPath(tempDir, osFs)} + subdir := workspace.Join("myproject") + err = subdir.MkdirAll(0700) + s.Nil(err) + + // Create files in the subdirectory + appPath := subdir.Join("app.py") + err = appPath.WriteFile([]byte("import flask"), 0600) + s.Nil(err) + + dataDir := subdir.Join("data") + err = dataDir.MkdirAll(0700) + s.Nil(err) + dataFile := dataDir.Join("input.csv") + err = dataFile.WriteFile([]byte("x,y\n1,2"), 0600) + s.Nil(err) + + // Create a file in the parent (workspace root) that should NOT be included + rootFile := workspace.Join("unrelated.txt") + err = rootFile.WriteFile([]byte("should not appear"), 0600) + s.Nil(err) + + dest := new(bytes.Buffer) + log := logging.New() + + // Bundle from the subdirectory, not the workspace root + bundler, err := NewBundler(subdir, NewManifest(), nil, log) + s.Nil(err) + manifest, err := bundler.CreateBundle(dest) + s.Nil(err) + s.NotNil(manifest) + + filenames := manifest.GetFilenames() + // Files should be relative to the subdirectory + s.Contains(filenames, "app.py") + s.Contains(filenames, "data/input.csv") + // Workspace root files should not be included + for _, f := range filenames { + s.NotContains(f, "unrelated.txt") + // Paths should not contain the subdirectory name as a prefix + s.False(strings.HasPrefix(f, "myproject/"), "file path should be relative to subdirectory, not workspace root") + } + + tarFiles := s.getTarFileNames(dest) + s.Contains(tarFiles, "app.py") + s.Contains(tarFiles, "data/") + s.Contains(tarFiles, "data/input.csv") + s.Contains(tarFiles, "manifest.json") + // Workspace root file should not be in the tar + s.NotContains(tarFiles, "unrelated.txt") +} + +func (s *BundlerSuite) TestCreateBundleFromSubdirectoryWithFileTarget() { + // When given a specific file in a subdirectory, the bundler + // should use the file's parent as baseDir and include the file. + // Uses real OS directories because CreateBundle calls os.Chdir. + osFs := afero.NewOsFs() + tempDir, err := os.MkdirTemp("", "bundle_subdir_file_test_*") + s.Nil(err) + defer os.RemoveAll(tempDir) + + subdir := util.AbsolutePath{Path: util.NewPath(filepath.Join(tempDir, "myproject"), osFs)} + err = subdir.MkdirAll(0700) + s.Nil(err) + + appPath := subdir.Join("app.py") + err = appPath.WriteFile([]byte("import flask"), 0600) + s.Nil(err) + + helperPath := subdir.Join("helpers.py") + err = helperPath.WriteFile([]byte("def helper(): pass"), 0600) + s.Nil(err) + + dest := new(bytes.Buffer) + log := logging.New() + + // Bundle from a specific file in the subdirectory + bundler, err := NewBundler(appPath, NewManifest(), nil, log) + s.Nil(err) + s.Equal(subdir.String(), bundler.baseDir.String()) + s.Equal("app.py", bundler.filename) + + manifest, err := bundler.CreateBundle(dest) + s.Nil(err) + filenames := manifest.GetFilenames() + s.Contains(filenames, "app.py") + s.Contains(filenames, "helpers.py") +} + func (s *BundlerSuite) TestNewBundleFromDirectorySymlinks() { if runtime.GOOS == "windows" { s.T().Skip() diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 9176f253a7..5ee50753d4 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -69,6 +69,75 @@ func (s *ConfigSuite) TestGetConfigPathEmpty() { s.Equal(path, s.cwd.Join(".posit", "publish", "default.toml")) } +func (s *ConfigSuite) TestGetConfigPathSubdirectory() { + // When the project is in a subdirectory, .posit/publish/ should be + // created within that subdirectory, not at the workspace root. + subdir := s.cwd.Join("myproject") + err := subdir.MkdirAll(0700) + s.NoError(err) + + path := GetConfigPath(subdir, "myConfig") + s.Equal(path, subdir.Join(".posit", "publish", "myConfig.toml")) + // Verify the path is under the subdirectory + s.True(strings.HasPrefix(path.String(), subdir.String())) +} + +func (s *ConfigSuite) TestWriteAndReadConfigInSubdirectory() { + // Verify config files can be created and read from a subdirectory project. + subdir := s.cwd.Join("myproject") + err := subdir.MkdirAll(0700) + s.NoError(err) + + configFile := GetConfigPath(subdir, "myConfig") + cfg := New() + cfg.ProductType = "connect" + cfg.Type = contenttypes.ContentTypeHTML + cfg.Entrypoint = "index.html" + cfg.Files = []string{"/index.html"} + err = cfg.WriteFile(configFile) + s.NoError(err) + + // Verify config dir was created under the subdirectory + configDir := GetConfigDir(subdir) + exists, err := configDir.Exists() + s.NoError(err) + s.True(exists) + + // Read back and verify + readCfg, err := FromFile(configFile) + s.NoError(err) + s.Equal(contenttypes.ContentTypeHTML, readCfg.Type) + s.Equal("index.html", readCfg.Entrypoint) + s.Equal([]string{"/index.html"}, readCfg.Files) +} + +func (s *ConfigSuite) TestListConfigFilesSubdirectory() { + // Verify listing config files scoped to a subdirectory + subdir := s.cwd.Join("myproject") + + // Create configs in the subdirectory + cfg := New() + cfg.ProductType = "connect" + cfg.Type = contenttypes.ContentTypeHTML + cfg.Entrypoint = "index.html" + err := cfg.WriteFile(GetConfigPath(subdir, "config1")) + s.NoError(err) + err = cfg.WriteFile(GetConfigPath(subdir, "config2")) + s.NoError(err) + + // Create a config at the root (should not appear) + err = cfg.WriteFile(GetConfigPath(s.cwd, "rootConfig")) + s.NoError(err) + + // List should only return configs from the subdirectory + files, err := ListConfigFiles(subdir) + s.NoError(err) + s.Len(files, 2) + for _, f := range files { + s.True(strings.HasPrefix(f.String(), subdir.String())) + } +} + func (s *ConfigSuite) TestFromFile() { s.createConfigFile("myConfig") path := GetConfigPath(s.cwd, "myConfig") diff --git a/internal/initialize/initialize_test.go b/internal/initialize/initialize_test.go index b610be8b92..f3bac71528 100644 --- a/internal/initialize/initialize_test.go +++ b/internal/initialize/initialize_test.go @@ -335,6 +335,71 @@ func (s *InitializeSuite) TestGetPossibleConfigsWithMissingEntrypoint() { s.Nil(configs[0].Python) } +func (s *InitializeSuite) TestGetPossibleHTMLConfigInSubdirectory() { + log := logging.New() + + // Create a subdirectory to simulate a project in workspace/static/ + subdir := s.cwd.Join("static") + err := subdir.MkdirAll(0700) + s.NoError(err) + err = subdir.Join("index.html").WriteFile([]byte(`Hello`), 0666) + s.NoError(err) + + i := NewInitialize( + detectors.NewContentTypeDetector, + setupMockPythonInspector(false, nil), + setupNewPythonInterpreterMock, + setupMockRInspector(false, nil), + setupNewRInterpreterMock, + ) + + // Pass subdir as the base, simulating deployment from a subdirectory + configs, err := i.GetPossibleConfigs(subdir, util.Path{}, util.Path{}, util.RelativePath{}, log) + s.NoError(err) + + s.Len(configs, 1) + s.Equal(contenttypes.ContentTypeHTML, configs[0].Type) + s.Equal("index.html", configs[0].Entrypoint) + // Files should be relative to the subdirectory, not the workspace root + s.Equal([]string{"/index.html"}, configs[0].Files) + // Title defaults to the subdirectory name + s.Equal("static", configs[0].Title) +} + +func (s *InitializeSuite) TestGetPossiblePythonConfigInSubdirectory() { + log := logging.New() + + // Create a subdirectory to simulate a project in workspace/fastapi-simple/ + subdir := s.cwd.Join("fastapi-simple") + err := subdir.MkdirAll(0700) + s.NoError(err) + err = subdir.Join("main.py").WriteFile([]byte(` + from fastapi import FastAPI + app = FastAPI() + `), 0666) + s.NoError(err) + + i := NewInitialize( + detectors.NewContentTypeDetector, + setupMockPythonInspector(true, nil), + setupNewPythonInterpreterMock, + setupMockRInspector(false, nil), + setupNewRInterpreterMock, + ) + + // Pass subdir as the base + configs, err := i.GetPossibleConfigs(subdir, util.Path{}, util.Path{}, util.RelativePath{}, log) + s.NoError(err) + + s.Len(configs, 1) + s.Equal("main.py", configs[0].Entrypoint) + // Files should be relative to the subdirectory + s.Contains(configs[0].Files, "/main.py") + s.Contains(configs[0].Files, "/requirements.txt") + // Title defaults to the subdirectory name + s.Equal("fastapi-simple", configs[0].Title) +} + func (s *InitializeSuite) TestNormalizeConfigHandlesUnknownConfigs() { log := logging.New() diff --git a/test/e2e/content-workspace/config-errors/.gitignore b/test/e2e/content-workspace/config-errors/.gitignore deleted file mode 100644 index 9141b5b23a..0000000000 --- a/test/e2e/content-workspace/config-errors/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/.quarto/ -!.posit diff --git a/test/e2e/content-workspace/config-errors/.posit/publish/deployments/deployment-4QPM.toml b/test/e2e/content-workspace/config-errors/.posit/publish/deployments/deployment-4QPM.toml deleted file mode 100644 index d1dc994688..0000000000 --- a/test/e2e/content-workspace/config-errors/.posit/publish/deployments/deployment-4QPM.toml +++ /dev/null @@ -1,43 +0,0 @@ -# This file is automatically generated by Posit Publisher; do not edit. -'$schema' = 'https://cdn.posit.co/publisher/schemas/posit-publishing-record-schema-v3.json' -server_type = 'connect' -server_url = 'http://localhost:3939' -client_version = '1.10.0-21-gf65d45573' -created_at = '2025-01-22T10:45:45-08:00' -dismissed_at = '' -type = 'python-fastapi' -configuration_name = 'fastapi-simple-DHJL' -id = '913f357e-1060-41f6-a619-2515a959250d' -dashboard_url = 'http://localhost:3939/connect/#/apps/913f357e-1060-41f6-a619-2515a959250d' -direct_url = 'http://localhost:3939/content/913f357e-1060-41f6-a619-2515a959250d/' -logs_url = 'http://localhost:3939/connect/#/apps/913f357e-1060-41f6-a619-2515a959250d/logs' -deployed_at = '2025-02-10T12:27:54-08:00' -bundle_id = '402' -bundle_url = 'http://localhost:3939/__api__/v1/content/913f357e-1060-41f6-a619-2515a959250d/bundles/402/download' -files = [ - '.posit/publish/deployments/deployment-4QPM.toml', - '.posit/publish/fastapi-simple-DHJL.toml', - 'requirements.txt', - 'simple.py' -] -requirements = [ - 'fastapi' -] - -[configuration] -'$schema' = 'https://cdn.posit.co/publisher/schemas/posit-publishing-schema-v3.json' -type = 'python-fastapi' -entrypoint = 'simple.py' -validate = true -files = [ - '/simple.py', - '/requirements.txt', - '/.posit/publish/fastapi-simple-DHJL.toml', - '/.posit/publish/deployments/deployment-4QPM.toml' -] -title = 'fastapi-simple' - -[configuration.python] -version = '3.11.9' -package_file = 'requirements.txt' -package_manager = 'pip' diff --git a/test/e2e/content-workspace/config-errors/.posit/publish/deployments/deployment-P869.toml b/test/e2e/content-workspace/config-errors/.posit/publish/deployments/deployment-P869.toml deleted file mode 100644 index 5ee7f94056..0000000000 --- a/test/e2e/content-workspace/config-errors/.posit/publish/deployments/deployment-P869.toml +++ /dev/null @@ -1,278 +0,0 @@ -# This file is automatically generated by Posit Publisher; do not edit. -'$schema' = 'https://cdn.posit.co/publisher/schemas/posit-publishing-record-schema-v3.json' -server_type = 'connect' -server_url = 'http://connect-publisher-e2e:3939' -client_version = '' -created_at = '2025-01-17T11:27:38-08:00' -type = 'quarto-static' -configuration_name = 'quarto-project-8G2B' -id = '4e230f05-c52f-4f04-8a06-98ddc6a93cea' -dashboard_url = 'http://connect-publisher-e2e:3939/connect/#/apps/4e230f05-c52f-4f04-8a06-98ddc6a93cea' -direct_url = 'http://connect-publisher-e2e:3939/content/4e230f05-c52f-4f04-8a06-98ddc6a93cea/' -logs_url = 'http://connect-publisher-e2e:3939/connect/#/apps/4e230f05-c52f-4f04-8a06-98ddc6a93cea/logs' -deployed_at = '2025-01-17T16:16:48-08:00' -bundle_id = '175' -bundle_url = 'http://connect-publisher-e2e:3939/__api__/v1/content/4e230f05-c52f-4f04-8a06-98ddc6a93cea/bundles/175/download' -files = [ - '_quarto.yml', - 'quarto-project.qmd', - 'requirements.txt' -] - -[deployment_error] -code = 'requirementsFileReadingError' -message = 'Missing dependency file requirements.txt. This file must be included in the deployment.' -operation = 'publish/checkCapabilities' - -[deployment_error.data] -RequirementsFile = 'quarto-project/requirements.txt' - -[configuration] -'$schema' = 'https://cdn.posit.co/publisher/schemas/posit-publishing-schema-v3.json' -type = 'quarto-static' -entrypoint = 'quarto-project.qmd' -validate = true -files = [ - '/quarto-project.qmd', - '/_quarto.yml', - '/', - '/' -] -title = 'quarto-project' - -[configuration.python] -version = '3.8.2' -package_file = 'requirements.txt' -package_manager = 'pip' - -[configuration.r] -version = '4.3.3' -package_file = 'renv.lock' -package_manager = 'renv' - -[configuration.quarto] -version = '1.6.39' -engines = ['jupyter', 'knitr'] - -[renv] -[renv.r] -version = '4.3.3' - -[[renv.r.repositories]] -name = 'CRAN' -url = 'https://cloud.r-project.org' - -[renv.packages] -[renv.packages.R6] -package = 'R6' -version = '2.5.1' -source = 'Repository' -repository = 'CRAN' -requirements = ['R'] -hash = '470851b6d5d0ac559e9d01bb352b4021' - -[renv.packages.base64enc] -package = 'base64enc' -version = '0.1-3' -source = 'Repository' -repository = 'CRAN' -requirements = ['R'] -hash = '543776ae6848fde2f48ff3816d0628bc' - -[renv.packages.bslib] -package = 'bslib' -version = '0.8.0' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'base64enc', 'cachem', 'fastmap', 'grDevices', 'htmltools', 'jquerylib', 'jsonlite', 'lifecycle', 'memoise', 'mime', 'rlang', 'sass'] -hash = 'b299c6741ca9746fb227debcb0f9fb6c' - -[renv.packages.cachem] -package = 'cachem' -version = '1.1.0' -source = 'Repository' -repository = 'CRAN' -requirements = ['fastmap', 'rlang'] -hash = 'cd9a672193789068eb5a2aad65a0dedf' - -[renv.packages.cli] -package = 'cli' -version = '3.6.3' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'utils'] -hash = 'b21916dd77a27642b447374a5d30ecf3' - -[renv.packages.digest] -package = 'digest' -version = '0.6.37' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'utils'] -hash = '33698c4b3127fc9f506654607fb73676' - -[renv.packages.evaluate] -package = 'evaluate' -version = '0.23' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'methods'] -hash = 'daf4a1246be12c1fa8c7705a0935c1a0' - -[renv.packages.fastmap] -package = 'fastmap' -version = '1.2.0' -source = 'Repository' -repository = 'CRAN' -hash = 'aa5e1cd11c2d15497494c5292d7ffcc8' - -[renv.packages.fontawesome] -package = 'fontawesome' -version = '0.5.3' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'htmltools', 'rlang'] -hash = 'bd1297f9b5b1fc1372d19e2c4cd82215' - -[renv.packages.fs] -package = 'fs' -version = '1.6.5' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'methods'] -hash = '7f48af39fa27711ea5fbd183b399920d' - -[renv.packages.glue] -package = 'glue' -version = '1.8.0' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'methods'] -hash = '5899f1eaa825580172bb56c08266f37c' - -[renv.packages.highr] -package = 'highr' -version = '0.10' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'xfun'] -hash = '06230136b2d2b9ba5805e1963fa6e890' - -[renv.packages.htmltools] -package = 'htmltools' -version = '0.5.8.1' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'base64enc', 'digest', 'fastmap', 'grDevices', 'rlang', 'utils'] -hash = '81d371a9cc60640e74e4ab6ac46dcedc' - -[renv.packages.jquerylib] -package = 'jquerylib' -version = '0.1.4' -source = 'Repository' -repository = 'CRAN' -requirements = ['htmltools'] -hash = '5aab57a3bd297eee1c1d862735972182' - -[renv.packages.jsonlite] -package = 'jsonlite' -version = '1.8.9' -source = 'Repository' -repository = 'CRAN' -requirements = ['methods'] -hash = '4e993b65c2c3ffbffce7bb3e2c6f832b' - -[renv.packages.knitr] -package = 'knitr' -version = '1.45' -source = 'Repository' -repository = 'RSPM' -requirements = ['R', 'evaluate', 'highr', 'methods', 'tools', 'xfun', 'yaml'] -hash = '1ec462871063897135c1bcbe0fc8f07d' - -[renv.packages.lifecycle] -package = 'lifecycle' -version = '1.0.4' -source = 'Repository' -repository = 'RSPM' -requirements = ['R', 'cli', 'glue', 'rlang'] -hash = 'b8552d117e1b808b09a832f589b79035' - -[renv.packages.memoise] -package = 'memoise' -version = '2.0.1' -source = 'Repository' -repository = 'CRAN' -requirements = ['cachem', 'rlang'] -hash = 'e2817ccf4a065c5d9d7f2cfbe7c1d78c' - -[renv.packages.mime] -package = 'mime' -version = '0.12' -source = 'Repository' -repository = 'CRAN' -requirements = ['tools'] -hash = '18e9c28c1d3ca1560ce30658b22ce104' - -[renv.packages.rappdirs] -package = 'rappdirs' -version = '0.3.3' -source = 'Repository' -repository = 'CRAN' -requirements = ['R'] -hash = '5e3c5dc0b071b21fa128676560dbe94d' - -[renv.packages.renv] -package = 'renv' -version = '1.0.11' -source = 'Repository' -repository = 'CRAN' -requirements = ['utils'] -hash = '47623f66b4e80b3b0587bc5d7b309888' - -[renv.packages.rlang] -package = 'rlang' -version = '1.1.4' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'utils'] -hash = '3eec01f8b1dee337674b2e34ab1f9bc1' - -[renv.packages.rmarkdown] -package = 'rmarkdown' -version = '2.29' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'bslib', 'evaluate', 'fontawesome', 'htmltools', 'jquerylib', 'jsonlite', 'knitr', 'methods', 'tinytex', 'tools', 'utils', 'xfun', 'yaml'] -hash = 'df99277f63d01c34e95e3d2f06a79736' - -[renv.packages.sass] -package = 'sass' -version = '0.4.9' -source = 'Repository' -repository = 'CRAN' -requirements = ['R6', 'fs', 'htmltools', 'rappdirs', 'rlang'] -hash = 'd53dbfddf695303ea4ad66f86e99b95d' - -[renv.packages.tinytex] -package = 'tinytex' -version = '0.54' -source = 'Repository' -repository = 'CRAN' -requirements = ['xfun'] -hash = '3ec7e3ddcacc2d34a9046941222bf94d' - -[renv.packages.xfun] -package = 'xfun' -version = '0.49' -source = 'Repository' -repository = 'CRAN' -requirements = ['R', 'grDevices', 'stats', 'tools'] -hash = '8687398773806cfff9401a2feca96298' - -[renv.packages.yaml] -package = 'yaml' -version = '2.3.10' -source = 'Repository' -repository = 'CRAN' -hash = '51dab85c6c98e50a18d7551e9d49f76c' diff --git a/test/e2e/content-workspace/config-errors/.posit/publish/quarto-project-8G2B.toml b/test/e2e/content-workspace/config-errors/.posit/publish/quarto-project-8G2B.toml deleted file mode 100644 index deb8300d80..0000000000 --- a/test/e2e/content-workspace/config-errors/.posit/publish/quarto-project-8G2B.toml +++ /dev/null @@ -1,25 +0,0 @@ -# Configuration file generated by Posit Publisher. -# Please review and modify as needed. See the documentation for more options: -# https://github.com/posit-dev/publisher/blob/main/docs/configuration.md -'$schema' = 'https://cdn.posit.co/publisher/schemas/posit-publishing-schema-v3.json' -type = 'quarto-static' -entrypoint = 'quarto-project.qmd' -validate = true -files = [ - '/quarto-project.qmd', - '/_quarto.yml', - '/requirements.txt', - '/renv.lock', - '/.posit/publish/quarto-project-8G2B.toml', - '/.posit/publish/deployments/deployment-P869.toml' -] -title = 'quarto-project' -invalidParam = 'I am an intentional error' - -[python] - -[r] - -[quarto] -version = '1.6.39' -engines = ['jupyter'] diff --git a/test/e2e/content-workspace/config-errors/_quarto.yml b/test/e2e/content-workspace/config-errors/_quarto.yml deleted file mode 100644 index 8ea2bc6244..0000000000 --- a/test/e2e/content-workspace/config-errors/_quarto.yml +++ /dev/null @@ -1,2 +0,0 @@ -project: - title: "quarto-project" diff --git a/test/e2e/content-workspace/config-errors/quarto-project.Rproj b/test/e2e/content-workspace/config-errors/quarto-project.Rproj deleted file mode 100644 index 8e3c2ebc99..0000000000 --- a/test/e2e/content-workspace/config-errors/quarto-project.Rproj +++ /dev/null @@ -1,13 +0,0 @@ -Version: 1.0 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX diff --git a/test/e2e/content-workspace/config-errors/quarto-project.qmd b/test/e2e/content-workspace/config-errors/quarto-project.qmd deleted file mode 100644 index bfd673382a..0000000000 --- a/test/e2e/content-workspace/config-errors/quarto-project.qmd +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "quarto-project" -jupyter: python3 ---- - -## Quarto - -Quarto enables you to weave together content and executable code into a finished document. To learn more about Quarto see . - -```{python} -1 + 1 -``` diff --git a/test/e2e/content-workspace/config-errors/renv.lock b/test/e2e/content-workspace/config-errors/renv.lock deleted file mode 100644 index f5d6fd1f3a..0000000000 --- a/test/e2e/content-workspace/config-errors/renv.lock +++ /dev/null @@ -1,335 +0,0 @@ -{ - "R": { - "Version": "4.3.3", - "Repositories": [ - { - "Name": "CRAN", - "URL": "https://cloud.r-project.org" - } - ] - }, - "Packages": { - "R6": { - "Package": "R6", - "Version": "2.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "470851b6d5d0ac559e9d01bb352b4021" - }, - "base64enc": { - "Package": "base64enc", - "Version": "0.1-3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "543776ae6848fde2f48ff3816d0628bc" - }, - "bslib": { - "Package": "bslib", - "Version": "0.8.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "base64enc", - "cachem", - "fastmap", - "grDevices", - "htmltools", - "jquerylib", - "jsonlite", - "lifecycle", - "memoise", - "mime", - "rlang", - "sass" - ], - "Hash": "b299c6741ca9746fb227debcb0f9fb6c" - }, - "cachem": { - "Package": "cachem", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "fastmap", - "rlang" - ], - "Hash": "cd9a672193789068eb5a2aad65a0dedf" - }, - "cli": { - "Package": "cli", - "Version": "3.6.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "b21916dd77a27642b447374a5d30ecf3" - }, - "digest": { - "Package": "digest", - "Version": "0.6.37", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "33698c4b3127fc9f506654607fb73676" - }, - "evaluate": { - "Package": "evaluate", - "Version": "0.23", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "daf4a1246be12c1fa8c7705a0935c1a0" - }, - "fastmap": { - "Package": "fastmap", - "Version": "1.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8" - }, - "fontawesome": { - "Package": "fontawesome", - "Version": "0.5.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "htmltools", - "rlang" - ], - "Hash": "bd1297f9b5b1fc1372d19e2c4cd82215" - }, - "fs": { - "Package": "fs", - "Version": "1.6.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "7f48af39fa27711ea5fbd183b399920d" - }, - "glue": { - "Package": "glue", - "Version": "1.8.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "5899f1eaa825580172bb56c08266f37c" - }, - "highr": { - "Package": "highr", - "Version": "0.10", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "xfun" - ], - "Hash": "06230136b2d2b9ba5805e1963fa6e890" - }, - "htmltools": { - "Package": "htmltools", - "Version": "0.5.8.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "base64enc", - "digest", - "fastmap", - "grDevices", - "rlang", - "utils" - ], - "Hash": "81d371a9cc60640e74e4ab6ac46dcedc" - }, - "jquerylib": { - "Package": "jquerylib", - "Version": "0.1.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "htmltools" - ], - "Hash": "5aab57a3bd297eee1c1d862735972182" - }, - "jsonlite": { - "Package": "jsonlite", - "Version": "1.8.9", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "methods" - ], - "Hash": "4e993b65c2c3ffbffce7bb3e2c6f832b" - }, - "knitr": { - "Package": "knitr", - "Version": "1.45", - "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ - "R", - "evaluate", - "highr", - "methods", - "tools", - "xfun", - "yaml" - ], - "Hash": "1ec462871063897135c1bcbe0fc8f07d" - }, - "lifecycle": { - "Package": "lifecycle", - "Version": "1.0.4", - "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ - "R", - "cli", - "glue", - "rlang" - ], - "Hash": "b8552d117e1b808b09a832f589b79035" - }, - "memoise": { - "Package": "memoise", - "Version": "2.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cachem", - "rlang" - ], - "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" - }, - "mime": { - "Package": "mime", - "Version": "0.12", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "tools" - ], - "Hash": "18e9c28c1d3ca1560ce30658b22ce104" - }, - "rappdirs": { - "Package": "rappdirs", - "Version": "0.3.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "5e3c5dc0b071b21fa128676560dbe94d" - }, - "renv": { - "Package": "renv", - "Version": "1.0.11", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "utils" - ], - "Hash": "47623f66b4e80b3b0587bc5d7b309888" - }, - "rlang": { - "Package": "rlang", - "Version": "1.1.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "3eec01f8b1dee337674b2e34ab1f9bc1" - }, - "rmarkdown": { - "Package": "rmarkdown", - "Version": "2.29", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bslib", - "evaluate", - "fontawesome", - "htmltools", - "jquerylib", - "jsonlite", - "knitr", - "methods", - "tinytex", - "tools", - "utils", - "xfun", - "yaml" - ], - "Hash": "df99277f63d01c34e95e3d2f06a79736" - }, - "sass": { - "Package": "sass", - "Version": "0.4.9", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R6", - "fs", - "htmltools", - "rappdirs", - "rlang" - ], - "Hash": "d53dbfddf695303ea4ad66f86e99b95d" - }, - "tinytex": { - "Package": "tinytex", - "Version": "0.54", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "xfun" - ], - "Hash": "3ec7e3ddcacc2d34a9046941222bf94d" - }, - "xfun": { - "Package": "xfun", - "Version": "0.49", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "stats", - "tools" - ], - "Hash": "8687398773806cfff9401a2feca96298" - }, - "yaml": { - "Package": "yaml", - "Version": "2.3.10", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "51dab85c6c98e50a18d7551e9d49f76c" - } - } -} diff --git a/test/e2e/content-workspace/config-errors/requirements.txt b/test/e2e/content-workspace/config-errors/requirements.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/e2e/content-workspace/examples-shiny-python/.gitignore b/test/e2e/content-workspace/examples-shiny-python/.gitignore deleted file mode 100644 index eba74f4cd2..0000000000 --- a/test/e2e/content-workspace/examples-shiny-python/.gitignore +++ /dev/null @@ -1 +0,0 @@ -venv/ \ No newline at end of file diff --git a/test/e2e/content-workspace/examples-shiny-python/README.md b/test/e2e/content-workspace/examples-shiny-python/README.md deleted file mode 100644 index 2b98505549..0000000000 --- a/test/e2e/content-workspace/examples-shiny-python/README.md +++ /dev/null @@ -1,23 +0,0 @@ -[![](https://docs.posit.co/connect-cloud/images/cc-deploy.svg)](https://connect.posit.cloud/publish?contentType=shiny&sourceRepositoryURL=https%3A%2F%2Fgithub.com%2Fposit-hosted%2Fexamples-shiny-python&sourceRef=main&sourceRefType=branch&primaryFile=app.py&pythonVersion=3.11) - -# Shiny for Python Example for Posit Connect Cloud Deployment - -This example Shiny for Python application analyzes restaurant tipping, allowing users to filter by bill amount and food service category. - -## Connect Cloud - -[Connect Cloud](https://connect.posit.cloud/) makes it simple for you to publish and share data applications and documents in a single cloud environment within minutes. It supports the most popular Python and R frameworks, including: - -- [Shiny for Python](https://docs.posit.co/connect-cloud/how-to/python/shiny-python.html) and [Shiny for R](https://docs.posit.co/connect-cloud/how-to/r/shiny-r.html) -- [Streamlit](https://docs.posit.co/connect-cloud/how-to/python/streamlit.html) -- [Dash](https://docs.posit.co/connect-cloud/how-to/python/dash.html) -- [Bokeh](https://docs.posit.co/connect-cloud/how-to/python/bokeh.html) -- Quarto with Python and [Quarto with R](https://docs.posit.co/connect-cloud/how-to/r/quarto-r.html) -- Jupyter Notebooks -- R Markdown - -## Click image and publish to Connect Cloud - -[](https://connect.posit.cloud/publish?contentType=shiny&sourceRepositoryURL=https%3A%2F%2Fgithub.com%2Fposit-hosted%2Fexamples-shiny-python&sourceRef=main&sourceRefType=branch&primaryFile=app.py&pythonVersion=3.11) - -Create a [free account](https://connect.posit.cloud/), visit the [documentation](https://docs.posit.co/connect-cloud/), and join the [community](https://forum.posit.co/c/posit-professional-hosted/posit-connect-cloud/67). diff --git a/test/e2e/content-workspace/examples-shiny-python/app.py b/test/e2e/content-workspace/examples-shiny-python/app.py deleted file mode 100644 index b51073abf8..0000000000 --- a/test/e2e/content-workspace/examples-shiny-python/app.py +++ /dev/null @@ -1,164 +0,0 @@ -import faicons as fa -import plotly.express as px -import pandas as pd - -# Load data and compute static values -from shiny import reactive, render -from shiny.express import input, ui -from shinywidgets import render_plotly - -tips = pd.read_csv("data/tips.csv") -ui.include_css("styles.css") - -bill_rng = (min(tips.total_bill), max(tips.total_bill)) - -# Add page title and sidebar -ui.page_opts(title="Restaurant tipping", fillable=True) - -with ui.sidebar(open="desktop"): - ui.input_slider( - "total_bill", - "Bill amount", - min=bill_rng[0], - max=bill_rng[1], - value=bill_rng, - pre="$", - ) - ui.input_checkbox_group( - "time", - "Food service", - ["Lunch", "Dinner"], - selected=["Lunch", "Dinner"], - inline=True, - ) - ui.input_action_button("reset", "Reset filter") - -# Add main content -ICONS = { - "user": fa.icon_svg("user", "regular"), - "wallet": fa.icon_svg("wallet"), - "currency-dollar": fa.icon_svg("dollar-sign"), - "ellipsis": fa.icon_svg("ellipsis"), -} - -with ui.layout_columns(fill=False): - with ui.value_box(showcase=ICONS["user"]): - "Total tippers" - - @render.express - def total_tippers(): - tips_data().shape[0] - - with ui.value_box(showcase=ICONS["wallet"]): - "Average tip" - - @render.express - def average_tip(): - d = tips_data() - if d.shape[0] > 0: - perc = d.tip / d.total_bill - f"{perc.mean():.1%}" - - with ui.value_box(showcase=ICONS["currency-dollar"]): - "Average bill" - - @render.express - def average_bill(): - d = tips_data() - if d.shape[0] > 0: - bill = d.total_bill.mean() - f"${bill:.2f}" - - -with ui.layout_columns(col_widths=[6, 6, 12]): - with ui.card(full_screen=True): - ui.card_header("Tips data") - - @render.data_frame - def table(): - return render.DataGrid(tips_data()) - - with ui.card(full_screen=True): - with ui.card_header(class_="d-flex justify-content-between align-items-center"): - "Total bill vs tip" - with ui.popover(title="Add a color variable", placement="top"): - ICONS["ellipsis"] - ui.input_radio_buttons( - "scatter_color", - None, - ["none", "sex", "smoker", "day", "time"], - inline=True, - ) - - @render_plotly - def scatterplot(): - color = input.scatter_color() - return px.scatter( - tips_data(), - x="total_bill", - y="tip", - color=None if color == "none" else color, - trendline="lowess", - ) - - with ui.card(full_screen=True): - with ui.card_header(class_="d-flex justify-content-between align-items-center"): - "Tip percentages" - with ui.popover(title="Add a color variable"): - ICONS["ellipsis"] - ui.input_radio_buttons( - "tip_perc_y", - "Split by:", - ["sex", "smoker", "day", "time"], - selected="day", - inline=True, - ) - - @render_plotly - def tip_perc(): - from ridgeplot import ridgeplot - - dat = tips_data() - dat["percent"] = dat.tip / dat.total_bill - yvar = input.tip_perc_y() - uvals = dat[yvar].unique() - - samples = [[dat.percent[dat[yvar] == val]] for val in uvals] - - plt = ridgeplot( - samples=samples, - labels=uvals, - bandwidth=0.01, - colorscale="viridis", - colormode="row-index", - ) - - plt.update_layout( - legend=dict( - orientation="h", yanchor="bottom", y=1.02, xanchor="center", x=0.5 - ) - ) - - return plt - - - - -# -------------------------------------------------------- -# Reactive calculations and effects -# -------------------------------------------------------- - - -@reactive.calc -def tips_data(): - bill = input.total_bill() - idx1 = tips.total_bill.between(bill[0], bill[1]) - idx2 = tips.time.isin(input.time()) - return tips[idx1 & idx2] - - -@reactive.effect -@reactive.event(input.reset) -def _(): - ui.update_slider("total_bill", value=bill_rng) - ui.update_checkbox_group("time", selected=["Lunch", "Dinner"]) \ No newline at end of file diff --git a/test/e2e/content-workspace/examples-shiny-python/data/tips.csv b/test/e2e/content-workspace/examples-shiny-python/data/tips.csv deleted file mode 100644 index ba8880f18b..0000000000 --- a/test/e2e/content-workspace/examples-shiny-python/data/tips.csv +++ /dev/null @@ -1,245 +0,0 @@ -total_bill,tip,sex,smoker,day,time,size -16.99,1.01,Female,No,Sun,Dinner,2 -10.34,1.66,Male,No,Sun,Dinner,3 -21.01,3.5,Male,No,Sun,Dinner,3 -23.68,3.31,Male,No,Sun,Dinner,2 -24.59,3.61,Female,No,Sun,Dinner,4 -25.29,4.71,Male,No,Sun,Dinner,4 -8.77,2.0,Male,No,Sun,Dinner,2 -26.88,3.12,Male,No,Sun,Dinner,4 -15.04,1.96,Male,No,Sun,Dinner,2 -14.78,3.23,Male,No,Sun,Dinner,2 -10.27,1.71,Male,No,Sun,Dinner,2 -35.26,5.0,Female,No,Sun,Dinner,4 -15.42,1.57,Male,No,Sun,Dinner,2 -18.43,3.0,Male,No,Sun,Dinner,4 -14.83,3.02,Female,No,Sun,Dinner,2 -21.58,3.92,Male,No,Sun,Dinner,2 -10.33,1.67,Female,No,Sun,Dinner,3 -16.29,3.71,Male,No,Sun,Dinner,3 -16.97,3.5,Female,No,Sun,Dinner,3 -20.65,3.35,Male,No,Sat,Dinner,3 -17.92,4.08,Male,No,Sat,Dinner,2 -20.29,2.75,Female,No,Sat,Dinner,2 -15.77,2.23,Female,No,Sat,Dinner,2 -39.42,7.58,Male,No,Sat,Dinner,4 -19.82,3.18,Male,No,Sat,Dinner,2 -17.81,2.34,Male,No,Sat,Dinner,4 -13.37,2.0,Male,No,Sat,Dinner,2 -12.69,2.0,Male,No,Sat,Dinner,2 -21.7,4.3,Male,No,Sat,Dinner,2 -19.65,3.0,Female,No,Sat,Dinner,2 -9.55,1.45,Male,No,Sat,Dinner,2 -18.35,2.5,Male,No,Sat,Dinner,4 -15.06,3.0,Female,No,Sat,Dinner,2 -20.69,2.45,Female,No,Sat,Dinner,4 -17.78,3.27,Male,No,Sat,Dinner,2 -24.06,3.6,Male,No,Sat,Dinner,3 -16.31,2.0,Male,No,Sat,Dinner,3 -16.93,3.07,Female,No,Sat,Dinner,3 -18.69,2.31,Male,No,Sat,Dinner,3 -31.27,5.0,Male,No,Sat,Dinner,3 -16.04,2.24,Male,No,Sat,Dinner,3 -17.46,2.54,Male,No,Sun,Dinner,2 -13.94,3.06,Male,No,Sun,Dinner,2 -9.68,1.32,Male,No,Sun,Dinner,2 -30.4,5.6,Male,No,Sun,Dinner,4 -18.29,3.0,Male,No,Sun,Dinner,2 -22.23,5.0,Male,No,Sun,Dinner,2 -32.4,6.0,Male,No,Sun,Dinner,4 -28.55,2.05,Male,No,Sun,Dinner,3 -18.04,3.0,Male,No,Sun,Dinner,2 -12.54,2.5,Male,No,Sun,Dinner,2 -10.29,2.6,Female,No,Sun,Dinner,2 -34.81,5.2,Female,No,Sun,Dinner,4 -9.94,1.56,Male,No,Sun,Dinner,2 -25.56,4.34,Male,No,Sun,Dinner,4 -19.49,3.51,Male,No,Sun,Dinner,2 -38.01,3.0,Male,Yes,Sat,Dinner,4 -26.41,1.5,Female,No,Sat,Dinner,2 -11.24,1.76,Male,Yes,Sat,Dinner,2 -48.27,6.73,Male,No,Sat,Dinner,4 -20.29,3.21,Male,Yes,Sat,Dinner,2 -13.81,2.0,Male,Yes,Sat,Dinner,2 -11.02,1.98,Male,Yes,Sat,Dinner,2 -18.29,3.76,Male,Yes,Sat,Dinner,4 -17.59,2.64,Male,No,Sat,Dinner,3 -20.08,3.15,Male,No,Sat,Dinner,3 -16.45,2.47,Female,No,Sat,Dinner,2 -3.07,1.0,Female,Yes,Sat,Dinner,1 -20.23,2.01,Male,No,Sat,Dinner,2 -15.01,2.09,Male,Yes,Sat,Dinner,2 -12.02,1.97,Male,No,Sat,Dinner,2 -17.07,3.0,Female,No,Sat,Dinner,3 -26.86,3.14,Female,Yes,Sat,Dinner,2 -25.28,5.0,Female,Yes,Sat,Dinner,2 -14.73,2.2,Female,No,Sat,Dinner,2 -10.51,1.25,Male,No,Sat,Dinner,2 -17.92,3.08,Male,Yes,Sat,Dinner,2 -27.2,4.0,Male,No,Thur,Lunch,4 -22.76,3.0,Male,No,Thur,Lunch,2 -17.29,2.71,Male,No,Thur,Lunch,2 -19.44,3.0,Male,Yes,Thur,Lunch,2 -16.66,3.4,Male,No,Thur,Lunch,2 -10.07,1.83,Female,No,Thur,Lunch,1 -32.68,5.0,Male,Yes,Thur,Lunch,2 -15.98,2.03,Male,No,Thur,Lunch,2 -34.83,5.17,Female,No,Thur,Lunch,4 -13.03,2.0,Male,No,Thur,Lunch,2 -18.28,4.0,Male,No,Thur,Lunch,2 -24.71,5.85,Male,No,Thur,Lunch,2 -21.16,3.0,Male,No,Thur,Lunch,2 -28.97,3.0,Male,Yes,Fri,Dinner,2 -22.49,3.5,Male,No,Fri,Dinner,2 -5.75,1.0,Female,Yes,Fri,Dinner,2 -16.32,4.3,Female,Yes,Fri,Dinner,2 -22.75,3.25,Female,No,Fri,Dinner,2 -40.17,4.73,Male,Yes,Fri,Dinner,4 -27.28,4.0,Male,Yes,Fri,Dinner,2 -12.03,1.5,Male,Yes,Fri,Dinner,2 -21.01,3.0,Male,Yes,Fri,Dinner,2 -12.46,1.5,Male,No,Fri,Dinner,2 -11.35,2.5,Female,Yes,Fri,Dinner,2 -15.38,3.0,Female,Yes,Fri,Dinner,2 -44.3,2.5,Female,Yes,Sat,Dinner,3 -22.42,3.48,Female,Yes,Sat,Dinner,2 -20.92,4.08,Female,No,Sat,Dinner,2 -15.36,1.64,Male,Yes,Sat,Dinner,2 -20.49,4.06,Male,Yes,Sat,Dinner,2 -25.21,4.29,Male,Yes,Sat,Dinner,2 -18.24,3.76,Male,No,Sat,Dinner,2 -14.31,4.0,Female,Yes,Sat,Dinner,2 -14.0,3.0,Male,No,Sat,Dinner,2 -7.25,1.0,Female,No,Sat,Dinner,1 -38.07,4.0,Male,No,Sun,Dinner,3 -23.95,2.55,Male,No,Sun,Dinner,2 -25.71,4.0,Female,No,Sun,Dinner,3 -17.31,3.5,Female,No,Sun,Dinner,2 -29.93,5.07,Male,No,Sun,Dinner,4 -10.65,1.5,Female,No,Thur,Lunch,2 -12.43,1.8,Female,No,Thur,Lunch,2 -24.08,2.92,Female,No,Thur,Lunch,4 -11.69,2.31,Male,No,Thur,Lunch,2 -13.42,1.68,Female,No,Thur,Lunch,2 -14.26,2.5,Male,No,Thur,Lunch,2 -15.95,2.0,Male,No,Thur,Lunch,2 -12.48,2.52,Female,No,Thur,Lunch,2 -29.8,4.2,Female,No,Thur,Lunch,6 -8.52,1.48,Male,No,Thur,Lunch,2 -14.52,2.0,Female,No,Thur,Lunch,2 -11.38,2.0,Female,No,Thur,Lunch,2 -22.82,2.18,Male,No,Thur,Lunch,3 -19.08,1.5,Male,No,Thur,Lunch,2 -20.27,2.83,Female,No,Thur,Lunch,2 -11.17,1.5,Female,No,Thur,Lunch,2 -12.26,2.0,Female,No,Thur,Lunch,2 -18.26,3.25,Female,No,Thur,Lunch,2 -8.51,1.25,Female,No,Thur,Lunch,2 -10.33,2.0,Female,No,Thur,Lunch,2 -14.15,2.0,Female,No,Thur,Lunch,2 -16.0,2.0,Male,Yes,Thur,Lunch,2 -13.16,2.75,Female,No,Thur,Lunch,2 -17.47,3.5,Female,No,Thur,Lunch,2 -34.3,6.7,Male,No,Thur,Lunch,6 -41.19,5.0,Male,No,Thur,Lunch,5 -27.05,5.0,Female,No,Thur,Lunch,6 -16.43,2.3,Female,No,Thur,Lunch,2 -8.35,1.5,Female,No,Thur,Lunch,2 -18.64,1.36,Female,No,Thur,Lunch,3 -11.87,1.63,Female,No,Thur,Lunch,2 -9.78,1.73,Male,No,Thur,Lunch,2 -7.51,2.0,Male,No,Thur,Lunch,2 -14.07,2.5,Male,No,Sun,Dinner,2 -13.13,2.0,Male,No,Sun,Dinner,2 -17.26,2.74,Male,No,Sun,Dinner,3 -24.55,2.0,Male,No,Sun,Dinner,4 -19.77,2.0,Male,No,Sun,Dinner,4 -29.85,5.14,Female,No,Sun,Dinner,5 -48.17,5.0,Male,No,Sun,Dinner,6 -25.0,3.75,Female,No,Sun,Dinner,4 -13.39,2.61,Female,No,Sun,Dinner,2 -16.49,2.0,Male,No,Sun,Dinner,4 -21.5,3.5,Male,No,Sun,Dinner,4 -12.66,2.5,Male,No,Sun,Dinner,2 -16.21,2.0,Female,No,Sun,Dinner,3 -13.81,2.0,Male,No,Sun,Dinner,2 -17.51,3.0,Female,Yes,Sun,Dinner,2 -24.52,3.48,Male,No,Sun,Dinner,3 -20.76,2.24,Male,No,Sun,Dinner,2 -31.71,4.5,Male,No,Sun,Dinner,4 -10.59,1.61,Female,Yes,Sat,Dinner,2 -10.63,2.0,Female,Yes,Sat,Dinner,2 -50.81,10.0,Male,Yes,Sat,Dinner,3 -15.81,3.16,Male,Yes,Sat,Dinner,2 -7.25,5.15,Male,Yes,Sun,Dinner,2 -31.85,3.18,Male,Yes,Sun,Dinner,2 -16.82,4.0,Male,Yes,Sun,Dinner,2 -32.9,3.11,Male,Yes,Sun,Dinner,2 -17.89,2.0,Male,Yes,Sun,Dinner,2 -14.48,2.0,Male,Yes,Sun,Dinner,2 -9.6,4.0,Female,Yes,Sun,Dinner,2 -34.63,3.55,Male,Yes,Sun,Dinner,2 -34.65,3.68,Male,Yes,Sun,Dinner,4 -23.33,5.65,Male,Yes,Sun,Dinner,2 -45.35,3.5,Male,Yes,Sun,Dinner,3 -23.17,6.5,Male,Yes,Sun,Dinner,4 -40.55,3.0,Male,Yes,Sun,Dinner,2 -20.69,5.0,Male,No,Sun,Dinner,5 -20.9,3.5,Female,Yes,Sun,Dinner,3 -30.46,2.0,Male,Yes,Sun,Dinner,5 -18.15,3.5,Female,Yes,Sun,Dinner,3 -23.1,4.0,Male,Yes,Sun,Dinner,3 -15.69,1.5,Male,Yes,Sun,Dinner,2 -19.81,4.19,Female,Yes,Thur,Lunch,2 -28.44,2.56,Male,Yes,Thur,Lunch,2 -15.48,2.02,Male,Yes,Thur,Lunch,2 -16.58,4.0,Male,Yes,Thur,Lunch,2 -7.56,1.44,Male,No,Thur,Lunch,2 -10.34,2.0,Male,Yes,Thur,Lunch,2 -43.11,5.0,Female,Yes,Thur,Lunch,4 -13.0,2.0,Female,Yes,Thur,Lunch,2 -13.51,2.0,Male,Yes,Thur,Lunch,2 -18.71,4.0,Male,Yes,Thur,Lunch,3 -12.74,2.01,Female,Yes,Thur,Lunch,2 -13.0,2.0,Female,Yes,Thur,Lunch,2 -16.4,2.5,Female,Yes,Thur,Lunch,2 -20.53,4.0,Male,Yes,Thur,Lunch,4 -16.47,3.23,Female,Yes,Thur,Lunch,3 -26.59,3.41,Male,Yes,Sat,Dinner,3 -38.73,3.0,Male,Yes,Sat,Dinner,4 -24.27,2.03,Male,Yes,Sat,Dinner,2 -12.76,2.23,Female,Yes,Sat,Dinner,2 -30.06,2.0,Male,Yes,Sat,Dinner,3 -25.89,5.16,Male,Yes,Sat,Dinner,4 -48.33,9.0,Male,No,Sat,Dinner,4 -13.27,2.5,Female,Yes,Sat,Dinner,2 -28.17,6.5,Female,Yes,Sat,Dinner,3 -12.9,1.1,Female,Yes,Sat,Dinner,2 -28.15,3.0,Male,Yes,Sat,Dinner,5 -11.59,1.5,Male,Yes,Sat,Dinner,2 -7.74,1.44,Male,Yes,Sat,Dinner,2 -30.14,3.09,Female,Yes,Sat,Dinner,4 -12.16,2.2,Male,Yes,Fri,Lunch,2 -13.42,3.48,Female,Yes,Fri,Lunch,2 -8.58,1.92,Male,Yes,Fri,Lunch,1 -15.98,3.0,Female,No,Fri,Lunch,3 -13.42,1.58,Male,Yes,Fri,Lunch,2 -16.27,2.5,Female,Yes,Fri,Lunch,2 -10.09,2.0,Female,Yes,Fri,Lunch,2 -20.45,3.0,Male,No,Sat,Dinner,4 -13.28,2.72,Male,No,Sat,Dinner,2 -22.12,2.88,Female,Yes,Sat,Dinner,2 -24.01,2.0,Male,Yes,Sat,Dinner,4 -15.69,3.0,Male,Yes,Sat,Dinner,3 -11.61,3.39,Male,No,Sat,Dinner,2 -10.77,1.47,Male,No,Sat,Dinner,2 -15.53,3.0,Male,Yes,Sat,Dinner,2 -10.07,1.25,Male,No,Sat,Dinner,2 -12.6,1.0,Male,Yes,Sat,Dinner,2 -32.83,1.17,Male,Yes,Sat,Dinner,2 -35.83,4.67,Female,No,Sat,Dinner,3 -29.03,5.92,Male,No,Sat,Dinner,3 -27.18,2.0,Female,Yes,Sat,Dinner,2 -22.67,2.0,Male,Yes,Sat,Dinner,2 -17.82,1.75,Male,No,Sat,Dinner,2 -18.78,3.0,Female,No,Thur,Dinner,2 \ No newline at end of file diff --git a/test/e2e/content-workspace/examples-shiny-python/requirements.txt b/test/e2e/content-workspace/examples-shiny-python/requirements.txt deleted file mode 100644 index 0afad42f6e..0000000000 --- a/test/e2e/content-workspace/examples-shiny-python/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -faicons==0.2.2 -shiny==1.5.1 -shinywidgets==0.7.1 -plotly==6.5.2 -pandas==3.0.1 -ridgeplot==0.5.0 -scipy==1.17.1 diff --git a/test/e2e/content-workspace/examples-shiny-python/styles.css b/test/e2e/content-workspace/examples-shiny-python/styles.css deleted file mode 100644 index 5466960490..0000000000 --- a/test/e2e/content-workspace/examples-shiny-python/styles.css +++ /dev/null @@ -1,12 +0,0 @@ -:root { - --bslib-sidebar-main-bg: #f8f8f8; -} - -.popover { - --bs-popover-header-bg: #222; - --bs-popover-header-color: #fff; -} - -.popover .btn-close { - filter: var(--bs-btn-close-white-filter); -} diff --git a/test/e2e/content-workspace/fastapi-simple/fastapi-main.py b/test/e2e/content-workspace/fastapi-simple/fastapi-main.py deleted file mode 100644 index 4a1c4d0de4..0000000000 --- a/test/e2e/content-workspace/fastapi-simple/fastapi-main.py +++ /dev/null @@ -1,17 +0,0 @@ -from typing import List - -from fastapi import FastAPI - -app = FastAPI() - - -@app.post("/capitalize") -def capitalize(text: List[str]) -> List[str]: - capitalized = [t.upper() for t in text] - return capitalized - - -@app.post("/paste") -def paste(first: List[str], second: List[str]) -> List[str]: - result = [a + " " + b for a, b in zip(first, second)] - return result diff --git a/test/e2e/content-workspace/fastapi-simple/pyproject.toml b/test/e2e/content-workspace/fastapi-simple/pyproject.toml deleted file mode 100644 index 95fd85ae51..0000000000 --- a/test/e2e/content-workspace/fastapi-simple/pyproject.toml +++ /dev/null @@ -1,6 +0,0 @@ -[project] -name = "fastapi-simple" -version = "0.1.0" -description = "Add your description here" -requires-python = ">=3.11" -dependencies = ["fastapi"] diff --git a/test/e2e/content-workspace/fastapi-simple/requirements.txt b/test/e2e/content-workspace/fastapi-simple/requirements.txt deleted file mode 100644 index db9d8eb18e..0000000000 --- a/test/e2e/content-workspace/fastapi-simple/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -# requirements.txt auto-generated by Posit Publisher -# using /Users/billsager/.pyenv/shims/python3 -fastapi==0.135.0 diff --git a/test/e2e/content-workspace/pyproject.toml b/test/e2e/content-workspace/pyproject.toml deleted file mode 100644 index 4876942913..0000000000 --- a/test/e2e/content-workspace/pyproject.toml +++ /dev/null @@ -1,6 +0,0 @@ -[project] -name = "simple" -version = "0.1.0" -description = "Add your description here" -requires-python = ">=3.11" - diff --git a/test/e2e/content-workspace/requirements.txt b/test/e2e/content-workspace/requirements.txt deleted file mode 100644 index e90fe7135f..0000000000 --- a/test/e2e/content-workspace/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -# requirements.txt auto-generated by Posit Publisher -# using /usr/bin/python3 -fastapi==0.135.0 diff --git a/test/e2e/content-workspace/rmd-site/.Rprofile b/test/e2e/content-workspace/rmd-site/.Rprofile deleted file mode 100644 index 81b960f5c6..0000000000 --- a/test/e2e/content-workspace/rmd-site/.Rprofile +++ /dev/null @@ -1 +0,0 @@ -source("renv/activate.R") diff --git a/test/e2e/content-workspace/rmd-site/_site.yml b/test/e2e/content-workspace/rmd-site/_site.yml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/e2e/content-workspace/rmd-site/another.Rmd b/test/e2e/content-workspace/rmd-site/another.Rmd deleted file mode 100644 index 9dd657a91e..0000000000 --- a/test/e2e/content-workspace/rmd-site/another.Rmd +++ /dev/null @@ -1,3 +0,0 @@ -# Another - -Here is another page. It links to [index](index.html) and [article](article.html). diff --git a/test/e2e/content-workspace/rmd-site/article.Rmd b/test/e2e/content-workspace/rmd-site/article.Rmd deleted file mode 100644 index 138030660f..0000000000 --- a/test/e2e/content-workspace/rmd-site/article.Rmd +++ /dev/null @@ -1,3 +0,0 @@ -# Article - -This is an article. It has a link to [index](index.html) and [another](another.html). diff --git a/test/e2e/content-workspace/rmd-site/index.Rmd b/test/e2e/content-workspace/rmd-site/index.Rmd deleted file mode 100644 index a7f82d22b3..0000000000 --- a/test/e2e/content-workspace/rmd-site/index.Rmd +++ /dev/null @@ -1,3 +0,0 @@ -# R Markdown site - -This is the index page. It has a link to [article](article.html) and [another](another.html). diff --git a/test/e2e/content-workspace/rmd-site/manifest.json b/test/e2e/content-workspace/rmd-site/manifest.json deleted file mode 100644 index 0e2aa6cc86..0000000000 --- a/test/e2e/content-workspace/rmd-site/manifest.json +++ /dev/null @@ -1,908 +0,0 @@ -{ - "version": 1, - "locale": "en_US", - "platform": "4.3.0", - "metadata": { - "appmode": "rmd-static", - "primary_rmd": "index.Rmd", - "primary_html": null, - "content_category": "site", - "has_parameters": false - }, - "packages": { - "R6": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "R6", - "Title": "Encapsulated Classes with Reference Semantics", - "Version": "2.5.1", - "Authors@R": "person(\"Winston\", \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@stdout.org\")", - "Description": "Creates classes with reference semantics, similar to R's built-in\n reference classes. Compared to reference classes, R6 classes are simpler\n and lighter-weight, and they are not built on S4 classes so they do not\n require the methods package. These classes allow public and private\n members, and they support inheritance, even when the classes are defined in\n different packages.", - "Depends": "R (>= 3.0)", - "Suggests": "testthat, pryr", - "License": "MIT + file LICENSE", - "URL": "https://r6.r-lib.org, https://github.com/r-lib/R6/", - "BugReports": "https://github.com/r-lib/R6/issues", - "RoxygenNote": "7.1.1", - "NeedsCompilation": "no", - "Packaged": "2021-08-06 20:18:46 UTC; winston", - "Author": "Winston Chang [aut, cre]", - "Maintainer": "Winston Chang ", - "Repository": "CRAN", - "Date/Publication": "2021-08-19 14:00:05 UTC", - "Built": "R 4.3.0; ; 2023-04-11 20:07:58 UTC; unix" - } - }, - "base64enc": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "base64enc", - "Version": "0.1-3", - "Title": "Tools for base64 encoding", - "Author": "Simon Urbanek ", - "Maintainer": "Simon Urbanek ", - "Depends": "R (>= 2.9.0)", - "Enhances": "png", - "Description": "This package provides tools for handling base64 encoding. It is more flexible than the orphaned base64 package.", - "License": "GPL-2 | GPL-3", - "URL": "http://www.rforge.net/base64enc", - "NeedsCompilation": "yes", - "Packaged": "2015-02-04 20:31:00 UTC; svnuser", - "Repository": "CRAN", - "Date/Publication": "2015-07-28 08:03:37", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:09:42 UTC; unix", - "Archs": "base64enc.so.dSYM" - } - }, - "bslib": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "bslib", - "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'", - "Version": "0.4.2", - "Authors@R": "c(\n person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"),\n person(family = \"RStudio\", role = \"cph\"),\n person(family = \"Bootstrap contributors\", role = \"ctb\",\n comment = \"Bootstrap library\"),\n person(family = \"Twitter, Inc\", role = \"cph\",\n comment = \"Bootstrap library\"),\n person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"),\n comment = \"Bootstrap colorpicker library\"),\n person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"),\n comment = \"Bootswatch library\"),\n person(family = \"PayPal\", role = c(\"ctb\", \"cph\"),\n comment = \"Bootstrap accessibility plugin\")\n )", - "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.", - "Depends": "R (>= 2.10)", - "Imports": "grDevices, htmltools (>= 0.5.4), jsonlite, sass (>= 0.4.0),\njquerylib (>= 0.1.3), rlang, cachem, memoise (>= 2.0.1),\nbase64enc, mime", - "Suggests": "shiny (>= 1.6.0), rmarkdown (>= 2.7), thematic, knitr,\ntestthat, withr, rappdirs, curl, magrittr, fontawesome, bsicons", - "License": "MIT + file LICENSE", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.3", - "Collate": "'bootswatch.R' 'bs-current-theme.R' 'bs-dependencies.R'\n'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'utils.R'\n'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'card.R'\n'deprecated.R' 'files.R' 'imports.R' 'layout.R' 'nav-items.R'\n'nav-update.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R'\n'precompiled.R' 'print.R' 'shiny-devmode.R' 'staticimports.R'\n'utils-shiny.R' 'utils-tags.R' 'value-box.R'\n'version-default.R' 'versions.R'", - "URL": "https://rstudio.github.io/bslib/, https://github.com/rstudio/bslib", - "BugReports": "https://github.com/rstudio/bslib/issues", - "Config/testthat/edition": "3", - "Config/Needs/routine": "desc, renv", - "Config/Needs/website": "brio, dplyr, glue, purrr, rprojroot, stringr,\ntidyr, DT, leaflet, plotly, htmlwidgets, shiny, ggplot2,\nsvglite", - "Config/Needs/deploy": "BH, DT, ggplot2, hexbin, lattice, lubridate,\ndplyr, modelr, nycflights13, histoslider, reactable, rprojroot,\nrsconnect, plotly, leaflet, gt, shiny, htmlwidgets", - "NeedsCompilation": "no", - "Packaged": "2022-12-15 16:02:29 UTC; cpsievert", - "Author": "Carson Sievert [aut, cre] (),\n Joe Cheng [aut],\n RStudio [cph],\n Bootstrap contributors [ctb] (Bootstrap library),\n Twitter, Inc [cph] (Bootstrap library),\n Javi Aguilar [ctb, cph] (Bootstrap colorpicker library),\n Thomas Park [ctb, cph] (Bootswatch library),\n PayPal [ctb, cph] (Bootstrap accessibility plugin)", - "Maintainer": "Carson Sievert ", - "Repository": "CRAN", - "Date/Publication": "2022-12-16 10:30:06 UTC", - "Built": "R 4.3.0; ; 2023-04-17 22:45:58 UTC; unix" - } - }, - "cachem": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "cachem", - "Version": "1.0.8", - "Title": "Cache R Objects with Automatic Pruning", - "Description": "Key-value stores with automatic pruning. Caches can limit\n either their total size or the age of the oldest object (or both),\n automatically pruning objects to maintain the constraints.", - "Authors@R": "c(\n person(\"Winston\", \"Chang\", , \"winston@rstudio.com\", c(\"aut\", \"cre\")),\n person(family = \"RStudio\", 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.1.1)", - "Suggests": "testthat", - "RoxygenNote": "7.2.3", - "Config/Needs/routine": "lobstr", - "Config/Needs/website": "pkgdown", - "NeedsCompilation": "yes", - "Packaged": "2023-05-01 15:38:38 UTC; winston", - "Author": "Winston Chang [aut, cre],\n RStudio [cph, fnd]", - "Maintainer": "Winston Chang ", - "Repository": "CRAN", - "Date/Publication": "2023-05-01 16:40:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-05-03 23:25:36 UTC; unix", - "Archs": "cachem.so.dSYM" - } - }, - "cli": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "cli", - "Title": "Helpers for Developing Command Line Interfaces", - "Version": "3.6.1", - "Authors@R": "c(\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"Hadley\", \"Wickham\", role = \"ctb\"),\n person(\"Kirill\", \"Müller\", role = \"ctb\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )", - "Description": "A suite of tools to build attractive command line interfaces\n ('CLIs'), from semantic elements: headings, lists, alerts, paragraphs,\n etc. Supports custom themes via a 'CSS'-like language. It also\n contains a number of lower level 'CLI' elements: rules, boxes, trees,\n and 'Unicode' symbols with 'ASCII' alternatives. It support ANSI\n colors and text styles as well.", - "License": "MIT + file LICENSE", - "URL": "https://cli.r-lib.org, https://github.com/r-lib/cli#readme", - "BugReports": "https://github.com/r-lib/cli/issues", - "Depends": "R (>= 3.4)", - "Imports": "utils", - "Suggests": "callr, covr, crayon, digest, glue (>= 1.6.0), grDevices,\nhtmltools, htmlwidgets, knitr, methods, mockery, processx, ps\n(>= 1.3.4.9000), rlang (>= 1.0.2.9003), rmarkdown, rprojroot,\nrstudioapi, testthat, tibble, whoami, withr", - "Config/Needs/website": "r-lib/asciicast, bench, brio, cpp11, decor, desc,\nfansi, prettyunits, sessioninfo, tidyverse/tidytemplate,\nusethis, vctrs", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.1.9000", - "NeedsCompilation": "yes", - "Packaged": "2023-03-22 13:59:32 UTC; gaborcsardi", - "Author": "Gábor Csárdi [aut, cre],\n Hadley Wickham [ctb],\n Kirill Müller [ctb],\n RStudio [cph, fnd]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN", - "Date/Publication": "2023-03-23 12:52:05 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:08:33 UTC; unix", - "Archs": "cli.so.dSYM" - } - }, - "digest": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "digest", - "Author": "Dirk Eddelbuettel with contributions\n by Antoine Lucas, Jarek Tuszynski, Henrik Bengtsson, Simon Urbanek,\n Mario Frasca, Bryan Lewis, Murray Stokely, Hannes Muehleisen,\n Duncan Murdoch, Jim Hester, Wush Wu, Qiang Kou, Thierry Onkelinx,\n Michel Lang, Viliam Simko, Kurt Hornik, Radford Neal, Kendon Bell,\n Matthew de Queljoe, Ion Suruceanu, Bill Denney, Dirk Schumacher,\n and Winston Chang.", - "Version": "0.6.31", - "Date": "2022-12-10", - "Maintainer": "Dirk Eddelbuettel ", - "Title": "Create Compact Hash Digests of R Objects", - "Description": "Implementation of a function 'digest()' for the creation of hash\n digests of arbitrary R objects (using the 'md5', 'sha-1', 'sha-256', 'crc32',\n 'xxhash', 'murmurhash', 'spookyhash' and 'blake3' algorithms) permitting easy\n comparison of R language objects, as well as functions such as'hmac()' to\n create hash-based message authentication code. Please note that this package\n is not meant to be deployed for cryptographic purposes for which more\n comprehensive (and widely tested) libraries such as 'OpenSSL' should be\n used.", - "URL": "https://github.com/eddelbuettel/digest,\nhttp://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", - "VignetteBuilder": "simplermarkdown", - "NeedsCompilation": "yes", - "Packaged": "2022-12-10 18:30:14 UTC; edd", - "Repository": "CRAN", - "Date/Publication": "2022-12-11 07:40:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:09:54 UTC; unix", - "Archs": "digest.so.dSYM" - } - }, - "ellipsis": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "ellipsis", - "Version": "0.3.2", - "Title": "Tools for Working with ...", - "Description": "The ellipsis is a powerful tool for extending functions. Unfortunately \n this power comes at a cost: misspelled arguments will be silently ignored. \n The ellipsis package provides a collection of functions to catch problems\n and alert the user.", - "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(\"RStudio\", role = \"cph\")\n )", - "License": "MIT + file LICENSE", - "Encoding": "UTF-8", - "RoxygenNote": "7.1.1", - "URL": "https://ellipsis.r-lib.org, https://github.com/r-lib/ellipsis", - "BugReports": "https://github.com/r-lib/ellipsis/issues", - "Depends": "R (>= 3.2)", - "Imports": "rlang (>= 0.3.0)", - "Suggests": "covr, testthat", - "NeedsCompilation": "yes", - "Packaged": "2021-04-29 12:06:44 UTC; lionel", - "Author": "Hadley Wickham [aut, cre],\n RStudio [cph]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN", - "Date/Publication": "2021-04-29 12:40:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:17:48 UTC; unix", - "Archs": "ellipsis.so.dSYM" - } - }, - "evaluate": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "evaluate", - "Type": "Package", - "Title": "Parsing and Evaluation Tools that Provide More Details than the\nDefault", - "Version": "0.21", - "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", role = \"aut\"),\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Michael\", \"Lawrence\", role = \"ctb\"),\n person(\"Thomas\", \"Kluyver\", role = \"ctb\"),\n person(\"Jeroen\", \"Ooms\", role = \"ctb\"),\n person(\"Barret\", \"Schloerke\", role = \"ctb\"),\n person(\"Adam\", \"Ryczkowski\", role = \"ctb\"),\n person(\"Hiroaki\", \"Yutani\", role = \"ctb\"),\n person(\"Michel\", \"Lang\", role = \"ctb\"),\n person(\"Karolis\", \"Koncevičius\", role = \"ctb\"),\n person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )", - "Description": "Parsing and evaluation tools that make it easy to recreate the\n command line behaviour of R.", - "License": "MIT + file LICENSE", - "URL": "https://github.com/r-lib/evaluate", - "BugReports": "https://github.com/r-lib/evaluate/issues", - "Depends": "R (>= 3.0.2)", - "Imports": "methods", - "Suggests": "covr, ggplot2, lattice, rlang, testthat (>= 3.0.0), withr", - "RoxygenNote": "7.2.3", - "Encoding": "UTF-8", - "Config/testthat/edition": "3", - "NeedsCompilation": "no", - "Packaged": "2023-05-01 21:56:45 UTC; yihui", - "Author": "Hadley Wickham [aut],\n Yihui Xie [aut, cre] (),\n Michael Lawrence [ctb],\n Thomas Kluyver [ctb],\n Jeroen Ooms [ctb],\n Barret Schloerke [ctb],\n Adam Ryczkowski [ctb],\n Hiroaki Yutani [ctb],\n Michel Lang [ctb],\n Karolis Koncevičius [ctb],\n Posit Software, PBC [cph, fnd]", - "Maintainer": "Yihui Xie ", - "Repository": "CRAN", - "Date/Publication": "2023-05-05 23:30:02 UTC", - "Built": "R 4.3.0; ; 2023-05-05 23:40:19 UTC; unix" - } - }, - "fastmap": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "fastmap", - "Title": "Fast Data Structures", - "Version": "1.1.1", - "Authors@R": "c(\n person(\"Winston\", \"Chang\", email = \"winston@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(given = \"RStudio\", role = c(\"cph\", \"fnd\")),\n person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\")\n )", - "Description": "Fast implementation of data structures, including a key-value\n store, stack, and queue. Environments are commonly used as key-value stores\n in R, but every time a new key is used, it is added to R's global symbol\n table, causing a small amount of memory leakage. This can be problematic in\n cases where many different keys are used. Fastmap avoids this memory leak\n 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", - "Packaged": "2023-02-24 16:01:27 UTC; winston", - "Author": "Winston Chang [aut, cre],\n RStudio [cph, fnd],\n Tessil [cph] (hopscotch_map library)", - "Maintainer": "Winston Chang ", - "Repository": "CRAN", - "Date/Publication": "2023-02-24 16:30:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:09:53 UTC; unix", - "Archs": "fastmap.so.dSYM" - } - }, - "fontawesome": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Type": "Package", - "Package": "fontawesome", - "Version": "0.5.1", - "Title": "Easily Work with 'Font Awesome' Icons", - "Description": "Easily and flexibly insert 'Font Awesome' icons into 'R Markdown'\n documents and 'Shiny' apps. These icons can be inserted into HTML content\n through inline 'SVG' tags or 'i' tags. There is also a utility function for\n exporting 'Font Awesome' icons as 'PNG' images for those situations where\n raster graphics are needed.", - "Authors@R": "c(\n person(\"Richard\", \"Iannone\", , \"rich@posit.co\", c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0003-3925-190X\")),\n person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"ctb\",\n comment = c(ORCID = \"0000-0003-4474-2498\")),\n person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"ctb\"),\n person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"),\n comment = \"Font-Awesome font\"),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )", - "License": "MIT + file LICENSE", - "URL": "https://github.com/rstudio/fontawesome,\nhttps://rstudio.github.io/fontawesome/", - "BugReports": "https://github.com/rstudio/fontawesome/issues", - "Encoding": "UTF-8", - "ByteCompile": "true", - "RoxygenNote": "7.2.3", - "Depends": "R (>= 3.3.0)", - "Imports": "rlang (>= 1.0.6), htmltools (>= 0.5.1.1)", - "Suggests": "covr, dplyr (>= 1.0.8), knitr (>= 1.31), testthat (>= 3.0.0),\nrsvg", - "Config/testthat/edition": "3", - "NeedsCompilation": "no", - "Packaged": "2023-04-18 17:20:05 UTC; rich", - "Author": "Richard Iannone [aut, cre] (),\n Christophe Dervieux [ctb] (),\n Winston Chang [ctb],\n Dave Gandy [ctb, cph] (Font-Awesome font),\n Posit Software, PBC [cph, fnd]", - "Maintainer": "Richard Iannone ", - "Repository": "CRAN", - "Date/Publication": "2023-04-18 20:30:02 UTC", - "Built": "R 4.3.0; ; 2023-04-22 00:45:59 UTC; unix" - } - }, - "fs": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "fs", - "Title": "Cross-Platform File System Operations Based on 'libuv'", - "Version": "1.6.2", - "Authors@R": "c(\n person(\"Jim\", \"Hester\", role = \"aut\"),\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"),\n person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")),\n person(\"libuv project contributors\", role = \"cph\",\n comment = \"libuv library\"),\n person(\"Joyent, Inc. and other Node contributors\", role = \"cph\",\n comment = \"libuv library\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )", - "Description": "A cross-platform interface to file system operations, built\n on top of the 'libuv' C library.", - "License": "MIT + file LICENSE", - "URL": "https://fs.r-lib.org, https://github.com/r-lib/fs,\nhttps://fs.r-lib.org/", - "BugReports": "https://github.com/r-lib/fs/issues", - "Depends": "R (>= 3.4)", - "Imports": "methods", - "Suggests": "covr, crayon, knitr, pillar (>= 1.0.0), rmarkdown, spelling,\ntestthat (>= 3.0.0), tibble (>= 1.1.0), vctrs (>= 0.3.0), withr", - "VignetteBuilder": "knitr", - "ByteCompile": "true", - "Copyright": "file COPYRIGHTS", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.1.2", - "SystemRequirements": "GNU make", - "Config/testthat/edition": "3", - "Config/Needs/website": "tidyverse/tidytemplate", - "NeedsCompilation": "yes", - "Packaged": "2023-04-24 13:43:26 UTC; gaborcsardi", - "Author": "Jim Hester [aut],\n Hadley Wickham [aut],\n Gábor Csárdi [aut, cre],\n libuv project contributors [cph] (libuv library),\n Joyent, Inc. and other Node contributors [cph] (libuv library),\n RStudio [cph, fnd]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN", - "Date/Publication": "2023-04-25 08:30:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-30 06:45:54 UTC; unix", - "Archs": "fs.so.dSYM" - } - }, - "glue": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "glue", - "Title": "Interpreted String Literals", - "Version": "1.6.2", - "Authors@R": "c(\n person(\"Jim\", \"Hester\", role = \"aut\",\n comment = c(ORCID = \"0000-0002-2739-7082\")),\n person(\"Jennifer\", \"Bryan\", , \"jenny@rstudio.com\", role = c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-6983-2759\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )", - "Description": "An implementation of interpreted string literals, inspired by\n Python's Literal String Interpolation\n and Docstrings\n and Julia's Triple-Quoted\n String Literals\n .", - "License": "MIT + file LICENSE", - "URL": "https://github.com/tidyverse/glue, https://glue.tidyverse.org/", - "BugReports": "https://github.com/tidyverse/glue/issues", - "Depends": "R (>= 3.4)", - "Imports": "methods", - "Suggests": "covr, crayon, DBI, dplyr, forcats, ggplot2, knitr, magrittr,\nmicrobenchmark, R.utils, rmarkdown, rprintf, RSQLite, stringr,\ntestthat (>= 3.0.0), vctrs (>= 0.3.0), waldo (>= 0.3.0), withr", - "VignetteBuilder": "knitr", - "ByteCompile": "true", - "Config/Needs/website": "hadley/emo, tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.1.2", - "NeedsCompilation": "yes", - "Packaged": "2022-02-23 22:50:40 UTC; jenny", - "Author": "Jim Hester [aut] (),\n Jennifer Bryan [aut, cre] (),\n RStudio [cph, fnd]", - "Maintainer": "Jennifer Bryan ", - "Repository": "CRAN", - "Date/Publication": "2022-02-24 07:50:20 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:07:27 UTC; unix", - "Archs": "glue.so.dSYM" - } - }, - "highr": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "highr", - "Type": "Package", - "Title": "Syntax Highlighting for R Source Code", - "Version": "0.10", - "Authors@R": "c(\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Yixuan\", \"Qiu\", role = \"aut\"),\n person(\"Christopher\", \"Gandrud\", role = \"ctb\"),\n person(\"Qiang\", \"Li\", role = \"ctb\")\n )", - "Description": "Provides syntax highlighting for R source code. Currently it\n supports LaTeX and HTML output. Source code of other languages is supported\n 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.2.3", - "NeedsCompilation": "no", - "Packaged": "2022-12-22 06:43:07 UTC; yihui", - "Author": "Yihui Xie [aut, cre] (),\n Yixuan Qiu [aut],\n Christopher Gandrud [ctb],\n Qiang Li [ctb]", - "Maintainer": "Yihui Xie ", - "Repository": "CRAN", - "Date/Publication": "2022-12-22 07:00:02 UTC", - "Built": "R 4.3.0; ; 2023-04-12 06:44:58 UTC; unix" - } - }, - "htmltools": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "htmltools", - "Type": "Package", - "Title": "Tools for HTML", - "Version": "0.5.5", - "Authors@R": "c(\n person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"),\n person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(\"Barret\", \"Schloerke\", role = \"aut\", email = \"barret@rstudio.com\", comment = c(ORCID = \"0000-0001-9986-114X\")),\n person(\"Winston\", \"Chang\", role = \"aut\", email = \"winston@rstudio.com\", comment = c(ORCID = \"0000-0002-1576-2126\")),\n person(\"Yihui\", \"Xie\", role = \"aut\", email = \"yihui@rstudio.com\"),\n person(\"Jeff\", \"Allen\", role = \"aut\", email = \"jeff@rstudio.com\"),\n person(family = \"RStudio\", role = \"cph\")\n )", - "Description": "Tools for HTML generation and output.", - "Depends": "R (>= 2.14.1)", - "Imports": "utils, digest, grDevices, base64enc, rlang (>= 0.4.10),\nfastmap (>= 1.1.0), ellipsis", - "Suggests": "markdown, testthat, withr, Cairo, ragg, shiny", - "Enhances": "knitr", - "License": "GPL (>= 2)", - "URL": "https://github.com/rstudio/htmltools,\nhttps://rstudio.github.io/htmltools/", - "BugReports": "https://github.com/rstudio/htmltools/issues", - "RoxygenNote": "7.2.3", - "Encoding": "UTF-8", - "Collate": "'colors.R' 'fill.R' 'html_dependency.R' 'html_escape.R'\n'html_print.R' 'images.R' 'known_tags.R' 'selector.R'\n'staticimports.R' 'tag_query.R' 'utils.R' 'tags.R' 'template.R'", - "Config/Needs/website": "rstudio/quillt, bench", - "NeedsCompilation": "yes", - "Packaged": "2023-03-22 22:59:42 UTC; cpsievert", - "Author": "Joe Cheng [aut],\n Carson Sievert [aut, cre] (),\n Barret Schloerke [aut] (),\n Winston Chang [aut] (),\n Yihui Xie [aut],\n Jeff Allen [aut],\n RStudio [cph]", - "Maintainer": "Carson Sievert ", - "Repository": "CRAN", - "Date/Publication": "2023-03-23 09:50:06 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-12 06:43:49 UTC; unix", - "Archs": "htmltools.so.dSYM" - } - }, - "jquerylib": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "jquerylib", - "Title": "Obtain 'jQuery' as an HTML Dependency Object", - "Version": "0.1.4", - "Authors@R": "c(\n person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"),\n person(family = \"RStudio\", role = \"cph\"),\n person(family = \"jQuery Foundation\", role = \"cph\",\n comment = \"jQuery library and jQuery UI library\"),\n person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"),\n comment = \"jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt\")\n )", - "Description": "Obtain any major version of 'jQuery' () and use it in any webpage generated by 'htmltools' (e.g. 'shiny', 'htmlwidgets', and 'rmarkdown').\n 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", - "Packaged": "2021-04-26 16:40:21 UTC; cpsievert", - "Author": "Carson Sievert [aut, cre] (),\n Joe Cheng [aut],\n RStudio [cph],\n jQuery Foundation [cph] (jQuery library and jQuery UI library),\n jQuery contributors [ctb, cph] (jQuery library; authors listed in\n inst/lib/jquery-AUTHORS.txt)", - "Maintainer": "Carson Sievert ", - "Repository": "CRAN", - "Date/Publication": "2021-04-26 17:10:02 UTC", - "Built": "R 4.3.0; ; 2023-04-12 11:15:31 UTC; unix" - } - }, - "jsonlite": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "jsonlite", - "Version": "1.8.4", - "Title": "A Simple and Robust JSON Parser and Generator for R", - "License": "MIT + file LICENSE", - "Depends": "methods", - "Authors@R": "c(\n person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroen@berkeley.edu\",\n comment = c(ORCID = \"0000-0002-4035-0289\")),\n person(\"Duncan\", \"Temple Lang\", role = \"ctb\"),\n person(\"Lloyd\", \"Hilaiel\", role = \"cph\", comment=\"author of bundled libyajl\"))", - "URL": "https://arxiv.org/abs/1403.2805 (paper)", - "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 \n data and the web. Offers simple, flexible tools for working with JSON in R, and\n is particularly powerful for building pipelines and interacting with a web API. \n The implementation is based on the mapping described in the vignette (Ooms, 2014).\n In addition to converting JSON data from/to R objects, 'jsonlite' contains \n functions to stream, validate, and prettify JSON data. The unit tests included \n with the package verify that all edge cases are encoded and decoded consistently \n for use with dynamic data in systems and applications.", - "Suggests": "httr, vctrs, testthat, knitr, rmarkdown, R.rsp, sf", - "RoxygenNote": "7.2.1", - "Encoding": "UTF-8", - "NeedsCompilation": "yes", - "Packaged": "2022-12-05 23:21:23 UTC; jeroen", - "Author": "Jeroen Ooms [aut, cre] (),\n Duncan Temple Lang [ctb],\n Lloyd Hilaiel [cph] (author of bundled libyajl)", - "Repository": "CRAN", - "Date/Publication": "2022-12-06 08:10:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:18:22 UTC; unix", - "Archs": "jsonlite.so.dSYM" - } - }, - "knitr": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "knitr", - "Type": "Package", - "Title": "A General-Purpose Package for Dynamic Report Generation in R", - "Version": "1.42", - "Authors@R": "c(\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Abhraneel\", \"Sarma\", role = \"ctb\"),\n person(\"Adam\", \"Vogt\", role = \"ctb\"),\n person(\"Alastair\", \"Andrew\", role = \"ctb\"),\n person(\"Alex\", \"Zvoleff\", role = \"ctb\"),\n person(\"Amar\", \"Al-Zubaidi\", role = \"ctb\"),\n person(\"Andre\", \"Simon\", role = \"ctb\", comment = \"the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de\"),\n person(\"Aron\", \"Atkins\", role = \"ctb\"),\n person(\"Aaron\", \"Wolen\", role = \"ctb\"),\n person(\"Ashley\", \"Manton\", role = \"ctb\"),\n person(\"Atsushi\", \"Yasumoto\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8335-495X\")),\n person(\"Ben\", \"Baumer\", role = \"ctb\"),\n person(\"Brian\", \"Diggs\", role = \"ctb\"),\n person(\"Brian\", \"Zhang\", role = \"ctb\"),\n person(\"Bulat\", \"Yapparov\", role = \"ctb\"),\n person(\"Cassio\", \"Pereira\", role = \"ctb\"),\n person(\"Christophe\", \"Dervieux\", role = \"ctb\"),\n person(\"David\", \"Hall\", role = \"ctb\"),\n person(\"David\", \"Hugh-Jones\", role = \"ctb\"),\n person(\"David\", \"Robinson\", role = \"ctb\"),\n person(\"Doug\", \"Hemken\", role = \"ctb\"),\n person(\"Duncan\", \"Murdoch\", role = \"ctb\"),\n person(\"Elio\", \"Campitelli\", role = \"ctb\"),\n person(\"Ellis\", \"Hughes\", role = \"ctb\"),\n person(\"Emily\", \"Riederer\", role = \"ctb\"),\n person(\"Fabian\", \"Hirschmann\", role = \"ctb\"),\n person(\"Fitch\", \"Simeon\", role = \"ctb\"),\n person(\"Forest\", \"Fang\", role = \"ctb\"),\n person(c(\"Frank\", \"E\", \"Harrell\", \"Jr\"), role = \"ctb\", comment = \"the Sweavel package at inst/misc/Sweavel.sty\"),\n person(\"Garrick\", \"Aden-Buie\", role = \"ctb\"),\n person(\"Gregoire\", \"Detrez\", role = \"ctb\"),\n person(\"Hadley\", \"Wickham\", role = \"ctb\"),\n person(\"Hao\", \"Zhu\", role = \"ctb\"),\n person(\"Heewon\", \"Jeon\", role = \"ctb\"),\n person(\"Henrik\", \"Bengtsson\", role = \"ctb\"),\n person(\"Hiroaki\", \"Yutani\", role = \"ctb\"),\n person(\"Ian\", \"Lyttle\", role = \"ctb\"),\n person(\"Hodges\", \"Daniel\", role = \"ctb\"),\n person(\"Jacob\", \"Bien\", role = \"ctb\"),\n person(\"Jake\", \"Burkhead\", role = \"ctb\"),\n person(\"James\", \"Manton\", role = \"ctb\"),\n person(\"Jared\", \"Lander\", role = \"ctb\"),\n person(\"Jason\", \"Punyon\", role = \"ctb\"),\n person(\"Javier\", \"Luraschi\", role = \"ctb\"),\n person(\"Jeff\", \"Arnold\", role = \"ctb\"),\n person(\"Jenny\", \"Bryan\", role = \"ctb\"),\n person(\"Jeremy\", \"Ashkenas\", role = c(\"ctb\", \"cph\"), comment = \"the CSS file at inst/misc/docco-classic.css\"),\n person(\"Jeremy\", \"Stephens\", role = \"ctb\"),\n person(\"Jim\", \"Hester\", role = \"ctb\"),\n person(\"Joe\", \"Cheng\", role = \"ctb\"),\n person(\"Johannes\", \"Ranke\", role = \"ctb\"),\n person(\"John\", \"Honaker\", role = \"ctb\"),\n person(\"John\", \"Muschelli\", role = \"ctb\"),\n person(\"Jonathan\", \"Keane\", role = \"ctb\"),\n person(\"JJ\", \"Allaire\", role = \"ctb\"),\n person(\"Johan\", \"Toloe\", role = \"ctb\"),\n person(\"Jonathan\", \"Sidi\", role = \"ctb\"),\n person(\"Joseph\", \"Larmarange\", role = \"ctb\"),\n person(\"Julien\", \"Barnier\", role = \"ctb\"),\n person(\"Kaiyin\", \"Zhong\", role = \"ctb\"),\n person(\"Kamil\", \"Slowikowski\", role = \"ctb\"),\n person(\"Karl\", \"Forner\", role = \"ctb\"),\n person(c(\"Kevin\", \"K.\"), \"Smith\", role = \"ctb\"),\n person(\"Kirill\", \"Mueller\", role = \"ctb\"),\n person(\"Kohske\", \"Takahashi\", role = \"ctb\"),\n person(\"Lorenz\", \"Walthert\", role = \"ctb\"),\n person(\"Lucas\", \"Gallindo\", role = \"ctb\"),\n person(\"Marius\", \"Hofert\", role = \"ctb\"),\n person(\"Martin\", \"Modrák\", role = \"ctb\"),\n person(\"Michael\", \"Chirico\", role = \"ctb\"),\n person(\"Michael\", \"Friendly\", role = \"ctb\"),\n person(\"Michal\", \"Bojanowski\", role = \"ctb\"),\n person(\"Michel\", \"Kuhlmann\", role = \"ctb\"),\n person(\"Miller\", \"Patrick\", role = \"ctb\"),\n person(\"Nacho\", \"Caballero\", role = \"ctb\"),\n person(\"Nick\", \"Salkowski\", role = \"ctb\"),\n person(\"Niels Richard\", \"Hansen\", role = \"ctb\"),\n person(\"Noam\", \"Ross\", role = \"ctb\"),\n person(\"Obada\", \"Mahdi\", role = \"ctb\"),\n person(\"Pavel N.\", \"Krivitsky\", role = \"ctb\", comment=c(ORCID = \"0000-0002-9101-3362\")),\n person(\"Pedro\", \"Faria\", role = \"ctb\"),\n person(\"Qiang\", \"Li\", role = \"ctb\"),\n person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"),\n person(\"Richard\", \"Cotton\", role = \"ctb\"),\n person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"),\n person(\"Rodrigo\", \"Copetti\", role = \"ctb\"),\n person(\"Romain\", \"Francois\", role = \"ctb\"),\n person(\"Ruaridh\", \"Williamson\", role = \"ctb\"),\n person(\"Sagiru\", \"Mati\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1413-3974\")),\n person(\"Scott\", \"Kostyshak\", role = \"ctb\"),\n person(\"Sebastian\", \"Meyer\", role = \"ctb\"),\n person(\"Sietse\", \"Brouwer\", role = \"ctb\"),\n person(c(\"Simon\", \"de\"), \"Bernard\", role = \"ctb\"),\n person(\"Sylvain\", \"Rousseau\", role = \"ctb\"),\n person(\"Taiyun\", \"Wei\", role = \"ctb\"),\n person(\"Thibaut\", \"Assus\", role = \"ctb\"),\n person(\"Thibaut\", \"Lamadon\", role = \"ctb\"),\n person(\"Thomas\", \"Leeper\", role = \"ctb\"),\n person(\"Tim\", \"Mastny\", role = \"ctb\"),\n person(\"Tom\", \"Torsney-Weir\", role = \"ctb\"),\n person(\"Trevor\", \"Davis\", role = \"ctb\"),\n person(\"Viktoras\", \"Veitas\", role = \"ctb\"),\n person(\"Weicheng\", \"Zhu\", role = \"ctb\"),\n person(\"Wush\", \"Wu\", role = \"ctb\"),\n person(\"Zachary\", \"Foster\", role = \"ctb\"),\n person(\"Zhian N.\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\"))\n )", - "Description": "Provides a general-purpose tool for dynamic report generation in R\n using Literate Programming techniques.", - "Depends": "R (>= 3.3.0)", - "Imports": "evaluate (>= 0.15), highr, methods, yaml (>= 2.1.19), xfun (>=\n0.34), tools", - "Suggests": "markdown (>= 1.3), formatR, testit, digest, rgl (>=\n0.95.1201), codetools, rmarkdown, htmlwidgets (>= 0.7),\nwebshot, tikzDevice (>= 0.10), tinytex, reticulate (>= 1.4),\nJuliaCall (>= 0.11.1), magick, png, jpeg, gifski, xml2 (>=\n1.2.0), httr, DBI (>= 0.4-1), showtext, tibble, sass, bslib,\nragg, gridSVG, styler (>= 1.2.0), targets (>= 0.6.0)", - "License": "GPL", - "URL": "https://yihui.org/knitr/", - "BugReports": "https://github.com/yihui/knitr/issues", - "Encoding": "UTF-8", - "VignetteBuilder": "knitr", - "SystemRequirements": "Package vignettes based on R Markdown v2 or\nreStructuredText require Pandoc (http://pandoc.org). The\nfunction rst2pdf() requires rst2pdf\n(https://github.com/rst2pdf/rst2pdf).", - "Collate": "'block.R' 'cache.R' 'utils.R' 'citation.R' 'hooks-html.R'\n'plot.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R'\n'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R'\n'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R'\n'hooks-textile.R' 'hooks.R' 'output.R' 'package.R' 'pandoc.R'\n'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R'\n'template.R' 'utils-conversion.R' 'utils-rd2html.R'\n'utils-string.R' 'utils-sweave.R' 'utils-upload.R'\n'utils-vignettes.R' 'zzz.R'", - "RoxygenNote": "7.2.3", - "NeedsCompilation": "no", - "Packaged": "2023-01-20 05:51:44 UTC; yihui", - "Author": "Yihui Xie [aut, cre] (),\n Abhraneel Sarma [ctb],\n Adam Vogt [ctb],\n Alastair Andrew [ctb],\n Alex Zvoleff [ctb],\n Amar Al-Zubaidi [ctb],\n Andre Simon [ctb] (the CSS files under inst/themes/ were derived from\n the Highlight package http://www.andre-simon.de),\n Aron Atkins [ctb],\n Aaron Wolen [ctb],\n Ashley Manton [ctb],\n Atsushi Yasumoto [ctb] (),\n Ben Baumer [ctb],\n Brian Diggs [ctb],\n Brian Zhang [ctb],\n Bulat Yapparov [ctb],\n Cassio Pereira [ctb],\n Christophe Dervieux [ctb],\n David Hall [ctb],\n David Hugh-Jones [ctb],\n David Robinson [ctb],\n Doug Hemken [ctb],\n Duncan Murdoch [ctb],\n Elio Campitelli [ctb],\n Ellis Hughes [ctb],\n Emily Riederer [ctb],\n Fabian Hirschmann [ctb],\n Fitch Simeon [ctb],\n Forest Fang [ctb],\n Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty),\n Garrick Aden-Buie [ctb],\n Gregoire Detrez [ctb],\n Hadley Wickham [ctb],\n Hao Zhu [ctb],\n Heewon Jeon [ctb],\n Henrik Bengtsson [ctb],\n Hiroaki Yutani [ctb],\n Ian Lyttle [ctb],\n Hodges Daniel [ctb],\n Jacob Bien [ctb],\n Jake Burkhead [ctb],\n James Manton [ctb],\n Jared Lander [ctb],\n Jason Punyon [ctb],\n Javier Luraschi [ctb],\n Jeff Arnold [ctb],\n Jenny Bryan [ctb],\n Jeremy Ashkenas [ctb, cph] (the CSS file at\n inst/misc/docco-classic.css),\n Jeremy Stephens [ctb],\n Jim Hester [ctb],\n Joe Cheng [ctb],\n Johannes Ranke [ctb],\n John Honaker [ctb],\n John Muschelli [ctb],\n Jonathan Keane [ctb],\n JJ Allaire [ctb],\n Johan Toloe [ctb],\n Jonathan Sidi [ctb],\n Joseph Larmarange [ctb],\n Julien Barnier [ctb],\n Kaiyin Zhong [ctb],\n Kamil Slowikowski [ctb],\n Karl Forner [ctb],\n Kevin K. Smith [ctb],\n Kirill Mueller [ctb],\n Kohske Takahashi [ctb],\n Lorenz Walthert [ctb],\n Lucas Gallindo [ctb],\n Marius Hofert [ctb],\n Martin Modrák [ctb],\n Michael Chirico [ctb],\n Michael Friendly [ctb],\n Michal Bojanowski [ctb],\n Michel Kuhlmann [ctb],\n Miller Patrick [ctb],\n Nacho Caballero [ctb],\n Nick Salkowski [ctb],\n Niels Richard Hansen [ctb],\n Noam Ross [ctb],\n Obada Mahdi [ctb],\n Pavel N. Krivitsky [ctb] (),\n Pedro Faria [ctb],\n Qiang Li [ctb],\n Ramnath Vaidyanathan [ctb],\n Richard Cotton [ctb],\n Robert Krzyzanowski [ctb],\n Rodrigo Copetti [ctb],\n Romain Francois [ctb],\n Ruaridh Williamson [ctb],\n Sagiru Mati [ctb] (),\n Scott Kostyshak [ctb],\n Sebastian Meyer [ctb],\n Sietse Brouwer [ctb],\n Simon de Bernard [ctb],\n Sylvain Rousseau [ctb],\n Taiyun Wei [ctb],\n Thibaut Assus [ctb],\n Thibaut Lamadon [ctb],\n Thomas Leeper [ctb],\n Tim Mastny [ctb],\n Tom Torsney-Weir [ctb],\n Trevor Davis [ctb],\n Viktoras Veitas [ctb],\n Weicheng Zhu [ctb],\n Wush Wu [ctb],\n Zachary Foster [ctb],\n Zhian N. Kamvar [ctb] ()", - "Maintainer": "Yihui Xie ", - "Repository": "CRAN", - "Date/Publication": "2023-01-25 10:20:08 UTC", - "Built": "R 4.3.0; ; 2023-04-12 11:17:12 UTC; unix" - } - }, - "lifecycle": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "lifecycle", - "Title": "Manage the Life Cycle of your Package Functions", - "Version": "1.0.3", - "Authors@R": "c(\n person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = c(\"aut\", \"cre\")),\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\",\n comment = c(ORCID = \"0000-0003-4757-117X\")),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )", - "Description": "Manage the life cycle of your exported functions with shared\n conventions, documentation badges, and user-friendly deprecation\n 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.4)", - "Imports": "cli (>= 3.4.0), glue, rlang (>= 1.0.6)", - "Suggests": "covr, crayon, knitr, lintr, rmarkdown, testthat (>= 3.0.1),\ntibble, tidyverse, tools, vctrs, withr", - "VignetteBuilder": "knitr", - "Config/testthat/edition": "3", - "Config/Needs/website": "tidyverse/tidytemplate", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.1", - "NeedsCompilation": "no", - "Packaged": "2022-10-07 08:50:55 UTC; lionel", - "Author": "Lionel Henry [aut, cre],\n Hadley Wickham [aut] (),\n RStudio [cph, fnd]", - "Maintainer": "Lionel Henry ", - "Repository": "CRAN", - "Date/Publication": "2022-10-07 09:50:02 UTC", - "Built": "R 4.3.0; ; 2023-04-12 06:43:28 UTC; unix" - } - }, - "magrittr": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Type": "Package", - "Package": "magrittr", - "Title": "A Forward-Pipe Operator for R", - "Version": "2.0.3", - "Authors@R": "c(\n person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"),\n comment = \"Original author and creator of magrittr\"),\n person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"),\n person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"cre\"),\n person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n )", - "Description": "Provides a mechanism for chaining commands with a new\n forward-pipe operator, %>%. This operator will forward a value, or the\n result of an expression, into the next function call/expression.\n There is flexible support for the type of right-hand side expressions.\n For more information, see package vignette. To quote Rene Magritte,\n \"Ceci n'est pas un pipe.\"", - "License": "MIT + file LICENSE", - "URL": "https://magrittr.tidyverse.org,\nhttps://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.1.2", - "NeedsCompilation": "yes", - "Packaged": "2022-03-29 09:34:37 UTC; lionel", - "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of\n magrittr),\n Hadley Wickham [aut],\n Lionel Henry [cre],\n RStudio [cph, fnd]", - "Maintainer": "Lionel Henry ", - "Repository": "CRAN", - "Date/Publication": "2022-03-30 07:30:09 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:07:22 UTC; unix", - "Archs": "magrittr.so.dSYM" - } - }, - "memoise": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "memoise", - "Title": "'Memoisation' of Functions", - "Version": "2.0.1", - "Authors@R": "\n c(person(given = \"Hadley\",\n family = \"Wickham\",\n role = \"aut\",\n email = \"hadley@rstudio.com\"),\n person(given = \"Jim\",\n family = \"Hester\",\n role = \"aut\"),\n person(given = \"Winston\",\n family = \"Chang\",\n role = c(\"aut\", \"cre\"),\n email = \"winston@rstudio.com\"),\n person(given = \"Kirill\",\n family = \"Müller\",\n role = \"aut\",\n email = \"krlmlr+r@mailbox.org\"),\n person(given = \"Daniel\",\n family = \"Cook\",\n role = \"aut\",\n email = \"danielecook@gmail.com\"),\n person(given = \"Mark\",\n family = \"Edmondson\",\n role = \"ctb\",\n email = \"r@sunholo.com\"))", - "Description": "Cache the results of a function so that when you\n call it again with the same arguments it returns the previously computed\n 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,\ntestthat", - "Encoding": "UTF-8", - "RoxygenNote": "7.1.2", - "NeedsCompilation": "no", - "Packaged": "2021-11-24 21:24:50 UTC; jhester", - "Author": "Hadley Wickham [aut],\n Jim Hester [aut],\n Winston Chang [aut, cre],\n Kirill Müller [aut],\n Daniel Cook [aut],\n Mark Edmondson [ctb]", - "Maintainer": "Winston Chang ", - "Repository": "CRAN", - "Date/Publication": "2021-11-26 16:11:10 UTC", - "Built": "R 4.3.0; ; 2023-04-17 22:23:05 UTC; unix" - } - }, - "mime": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "mime", - "Type": "Package", - "Title": "Map Filenames to MIME Types", - "Version": "0.12", - "Authors@R": "c(\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Jeffrey\", \"Horner\", role = \"ctb\"),\n person(\"Beilei\", \"Bian\", role = \"ctb\")\n )", - "Description": "Guesses the MIME type from a filename extension using the data\n 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.1.1", - "Encoding": "UTF-8", - "NeedsCompilation": "yes", - "Packaged": "2021-09-28 02:06:04 UTC; yihui", - "Author": "Yihui Xie [aut, cre] (),\n Jeffrey Horner [ctb],\n Beilei Bian [ctb]", - "Maintainer": "Yihui Xie ", - "Repository": "CRAN", - "Date/Publication": "2021-09-28 05:00:05 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:09:16 UTC; unix", - "Archs": "mime.so.dSYM" - } - }, - "rappdirs": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Type": "Package", - "Package": "rappdirs", - "Title": "Application Directories: Determine Where to Save Data, Caches,\nand Logs", - "Version": "0.3.3", - "Authors@R": "\n c(person(given = \"Hadley\",\n family = \"Wickham\",\n role = c(\"trl\", \"cre\", \"cph\"),\n email = \"hadley@rstudio.com\"),\n person(given = \"RStudio\",\n role = \"cph\"),\n person(given = \"Sridhar\",\n family = \"Ratnakumar\",\n role = \"aut\"),\n person(given = \"Trent\",\n family = \"Mick\",\n role = \"aut\"),\n person(given = \"ActiveState\",\n role = \"cph\",\n comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"),\n person(given = \"Eddy\",\n family = \"Petrisor\",\n role = \"ctb\"),\n person(given = \"Trevor\",\n family = \"Davis\",\n role = c(\"trl\", \"aut\")),\n person(given = \"Gabor\",\n family = \"Csardi\",\n role = \"ctb\"),\n person(given = \"Gregory\",\n family = \"Jefferis\",\n role = \"ctb\"))", - "Description": "An easy way to determine which directories on the\n users computer you should use to save data, caches and logs. A port of\n Python's 'Appdirs' () to\n 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 (>= 3.2)", - "Suggests": "roxygen2, testthat (>= 3.0.0), covr, withr", - "Copyright": "Original python appdirs module copyright (c) 2010\nActiveState Software Inc. R port copyright Hadley Wickham,\nRStudio. See file LICENSE for details.", - "Encoding": "UTF-8", - "RoxygenNote": "7.1.1", - "Config/testthat/edition": "3", - "NeedsCompilation": "yes", - "Packaged": "2021-01-28 22:29:57 UTC; hadley", - "Author": "Hadley Wickham [trl, cre, cph],\n RStudio [cph],\n Sridhar Ratnakumar [aut],\n Trent Mick [aut],\n ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated\n from appdirs),\n Eddy Petrisor [ctb],\n Trevor Davis [trl, aut],\n Gabor Csardi [ctb],\n Gregory Jefferis [ctb]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN", - "Date/Publication": "2021-01-31 05:40:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:10:28 UTC; unix", - "Archs": "rappdirs.so.dSYM" - } - }, - "rlang": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "rlang", - "Version": "1.1.1", - "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", - "Description": "A toolbox for working with base types, core R features\n like the condition system, and core 'Tidyverse' features like tidy\n evaluation.", - "Authors@R": "c(\n person(\"Lionel\", \"Henry\", ,\"lionel@posit.co\", c(\"aut\", \"cre\")),\n person(\"Hadley\", \"Wickham\", ,\"hadley@posit.co\", \"aut\"),\n person(given = \"mikefc\",\n email = \"mikefc@coolbutuseless.com\", \n role = \"cph\", \n comment = \"Hash implementation based on Mike's xxhashlite\"),\n person(given = \"Yann\",\n family = \"Collet\",\n role = \"cph\", \n comment = \"Author of the embedded xxHash library\"),\n person(given = \"Posit, PBC\", role = c(\"cph\", \"fnd\"))\n )", - "License": "MIT + file LICENSE", - "ByteCompile": "true", - "Biarch": "true", - "Depends": "R (>= 3.5.0)", - "Imports": "utils", - "Suggests": "cli (>= 3.1.0), covr, crayon, fs, glue, knitr, magrittr,\nmethods, pillar, rmarkdown, stats, testthat (>= 3.0.0), tibble,\nusethis, vctrs (>= 0.2.3), withr", - "Enhances": "winch", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.3", - "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", - "BugReports": "https://github.com/r-lib/rlang/issues", - "Config/testthat/edition": "3", - "Config/Needs/website": "dplyr, tidyverse/tidytemplate", - "NeedsCompilation": "yes", - "Packaged": "2023-04-28 10:48:43 UTC; lionel", - "Author": "Lionel Henry [aut, cre],\n Hadley Wickham [aut],\n mikefc [cph] (Hash implementation based on Mike's xxhashlite),\n Yann Collet [cph] (Author of the embedded xxHash library),\n Posit, PBC [cph, fnd]", - "Maintainer": "Lionel Henry ", - "Repository": "CRAN", - "Date/Publication": "2023-04-28 22:30:03 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-30 06:48:25 UTC; unix", - "Archs": "rlang.so.dSYM" - } - }, - "rmarkdown": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Type": "Package", - "Package": "rmarkdown", - "Title": "Dynamic Documents for R", - "Version": "2.21", - "Authors@R": "c(\n person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"),\n person(\"Yihui\", \"Xie\", , \"xie@yihui.name\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")),\n person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"),\n person(\"Javier\", \"Luraschi\", role = \"aut\"),\n person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"aut\"),\n person(\"Aron\", \"Atkins\", , \"aron@posit.co\", role = \"aut\"),\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"),\n person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"),\n person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"),\n person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")),\n person(\"Andrew\", \"Dunning\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0464-5036\")),\n person(\"Atsushi\", \"Yasumoto\", role = c(\"ctb\", \"cph\"), comment = c(ORCID = \"0000-0002-8335-495X\", cph = \"Number sections Lua filter\")),\n person(\"Barret\", \"Schloerke\", role = \"ctb\"),\n person(\"Carson\", \"Sievert\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4958-2844\")), \n person(\"Devon\", \"Ryan\", , \"dpryan79@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8549-0971\")),\n person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")),\n person(\"Jeff\", \"Allen\", , \"jeff@posit.co\", role = \"ctb\"), \n person(\"JooYoung\", \"Seo\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4064-6012\")),\n person(\"Malcolm\", \"Barrett\", role = \"ctb\"),\n person(\"Rob\", \"Hyndman\", , \"Rob.Hyndman@monash.edu\", role = \"ctb\"),\n person(\"Romain\", \"Lesur\", role = \"ctb\"),\n person(\"Roy\", \"Storey\", role = \"ctb\"),\n person(\"Ruben\", \"Arslan\", , \"ruben.arslan@uni-goettingen.de\", role = \"ctb\"),\n person(\"Sergio\", \"Oller\", role = \"ctb\"),\n person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")),\n person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/rmd/h/jqueryui-AUTHORS.txt\"),\n person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"),\n person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"),\n person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"),\n person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"),\n person(\"Alexander\", \"Farkas\", role = c(\"ctb\", \"cph\"), comment = \"html5shiv library\"),\n person(\"Scott\", \"Jehl\", role = c(\"ctb\", \"cph\"), comment = \"Respond.js library\"),\n person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"),\n person(\"Greg\", \"Franko\", role = c(\"ctb\", \"cph\"), comment = \"tocify library\"),\n person(\"John\", \"MacFarlane\", role = c(\"ctb\", \"cph\"), comment = \"Pandoc templates\"),\n person(, \"Google, Inc.\", role = c(\"ctb\", \"cph\"), comment = \"ioslides library\"),\n person(\"Dave\", \"Raggett\", role = \"ctb\", comment = \"slidy library\"),\n person(, \"W3C\", role = \"cph\", comment = \"slidy library\"),\n person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome\"),\n person(\"Ben\", \"Sperry\", role = \"ctb\", comment = \"Ionicons\"),\n person(, \"Drifty\", role = \"cph\", comment = \"Ionicons\"),\n person(\"Aidan\", \"Lister\", role = c(\"ctb\", \"cph\"), comment = \"jQuery StickyTabs\"),\n person(\"Benct Philip\", \"Jonsson\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\"),\n person(\"Albert\", \"Krewinkel\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\")\n )", - "Maintainer": "Yihui Xie ", - "Description": "Convert R Markdown documents into a variety of formats.", - "License": "GPL-3", - "URL": "https://github.com/rstudio/rmarkdown,\nhttps://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 (>=\n0.5.0), htmltools (>= 0.5.1), jquerylib, jsonlite, knitr (>=\n1.22), methods, stringr (>= 1.2.0), tinytex (>= 0.31), tools,\nutils, xfun (>= 0.36), yaml (>= 2.1.19)", - "Suggests": "digest, dygraphs, fs, rsconnect, downlit (>= 0.4.0), katex\n(>= 1.4.0), sass (>= 0.4.0), shiny (>= 1.6.0), testthat (>=\n3.0.3), tibble, vctrs, withr (>= 2.4.2)", - "VignetteBuilder": "knitr", - "Config/Needs/website": "rstudio/quillt, pkgdown", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.3", - "SystemRequirements": "pandoc (>= 1.14) - http://pandoc.org", - "NeedsCompilation": "no", - "Packaged": "2023-03-25 21:50:22 UTC; yihui", - "Author": "JJ Allaire [aut],\n Yihui Xie [aut, cre] (),\n Christophe Dervieux [aut] (),\n Jonathan McPherson [aut],\n Javier Luraschi [aut],\n Kevin Ushey [aut],\n Aron Atkins [aut],\n Hadley Wickham [aut],\n Joe Cheng [aut],\n Winston Chang [aut],\n Richard Iannone [aut] (),\n Andrew Dunning [ctb] (),\n Atsushi Yasumoto [ctb, cph] (,\n Number sections Lua filter),\n Barret Schloerke [ctb],\n Carson Sievert [ctb] (),\n Devon Ryan [ctb] (),\n Frederik Aust [ctb] (),\n Jeff Allen [ctb],\n JooYoung Seo [ctb] (),\n Malcolm Barrett [ctb],\n Rob Hyndman [ctb],\n Romain Lesur [ctb],\n Roy Storey [ctb],\n Ruben Arslan [ctb],\n Sergio Oller [ctb],\n Posit Software, PBC [cph, fnd],\n jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in\n inst/rmd/h/jqueryui-AUTHORS.txt),\n Mark Otto [ctb] (Bootstrap library),\n Jacob Thornton [ctb] (Bootstrap library),\n Bootstrap contributors [ctb] (Bootstrap library),\n Twitter, Inc [cph] (Bootstrap library),\n Alexander Farkas [ctb, cph] (html5shiv library),\n Scott Jehl [ctb, cph] (Respond.js library),\n Ivan Sagalaev [ctb, cph] (highlight.js library),\n Greg Franko [ctb, cph] (tocify library),\n John MacFarlane [ctb, cph] (Pandoc templates),\n Google, Inc. [ctb, cph] (ioslides library),\n Dave Raggett [ctb] (slidy library),\n W3C [cph] (slidy library),\n Dave Gandy [ctb, cph] (Font-Awesome),\n Ben Sperry [ctb] (Ionicons),\n Drifty [cph] (Ionicons),\n Aidan Lister [ctb, cph] (jQuery StickyTabs),\n Benct Philip Jonsson [ctb, cph] (pagebreak Lua filter),\n Albert Krewinkel [ctb, cph] (pagebreak Lua filter)", - "Repository": "CRAN", - "Date/Publication": "2023-03-26 22:00:03 UTC", - "Built": "R 4.3.0; ; 2023-05-15 19:16:40 UTC; unix" - } - }, - "sass": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Type": "Package", - "Package": "sass", - "Version": "0.4.6", - "Title": "Syntactically Awesome Style Sheets ('Sass')", - "Description": "An 'SCSS' compiler, powered by the 'LibSass' library. With this,\n R developers can use variables, inheritance, and functions to generate\n dynamic style sheets. The package uses the 'Sass CSS' extension language,\n which is stable, powerful, and CSS compatible.", - "Authors@R": "c(\n person(\"Joe\", \"Cheng\", , \"joe@rstudio.com\", \"aut\"),\n person(\"Timothy\", \"Mastny\", , \"tim.mastny@gmail.com\", \"aut\"),\n person(\"Richard\", \"Iannone\", , \"rich@rstudio.com\", \"aut\",\n comment = c(ORCID = \"0000-0003-3925-190X\")),\n person(\"Barret\", \"Schloerke\", , \"barret@rstudio.com\", \"aut\",\n comment = c(ORCID = \"0000-0001-9986-114X\")),\n person(\"Carson\", \"Sievert\", , \"carson@rstudio.com\", c(\"aut\", \"cre\"),\n comment = c(ORCID = \"0000-0002-4958-2844\")),\n person(\"Christophe\", \"Dervieux\", , \"cderv@rstudio.com\", c(\"ctb\"),\n comment = c(ORCID = \"0000-0003-4474-2498\")),\n person(family = \"RStudio\", role = c(\"cph\", \"fnd\")),\n person(family = \"Sass Open Source Foundation\", role = c(\"ctb\", \"cph\"),\n comment = \"LibSass library\"),\n person(\"Greter\", \"Marcel\", role = c(\"ctb\", \"cph\"),\n comment = \"LibSass library\"),\n person(\"Mifsud\", \"Michael\", role = c(\"ctb\", \"cph\"),\n comment = \"LibSass library\"),\n person(\"Hampton\", \"Catlin\", role = c(\"ctb\", \"cph\"),\n comment = \"LibSass library\"),\n person(\"Natalie\", \"Weizenbaum\", role = c(\"ctb\", \"cph\"),\n comment = \"LibSass library\"),\n person(\"Chris\", \"Eppstein\", role = c(\"ctb\", \"cph\"),\n comment = \"LibSass library\"),\n person(\"Adams\", \"Joseph\", role = c(\"ctb\", \"cph\"),\n comment = \"json.cpp\"),\n person(\"Trifunovic\", \"Nemanja\", role = c(\"ctb\", \"cph\"),\n comment = \"utf8.h\")\n )", - "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.2.3", - "SystemRequirements": "GNU make", - "Imports": "fs, 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", - "Packaged": "2023-05-03 22:45:10 UTC; cpsievert", - "Author": "Joe Cheng [aut],\n Timothy Mastny [aut],\n Richard Iannone [aut] (),\n Barret Schloerke [aut] (),\n Carson Sievert [aut, cre] (),\n Christophe Dervieux [ctb] (),\n RStudio [cph, fnd],\n Sass Open Source Foundation [ctb, cph] (LibSass library),\n Greter Marcel [ctb, cph] (LibSass library),\n Mifsud Michael [ctb, cph] (LibSass library),\n Hampton Catlin [ctb, cph] (LibSass library),\n Natalie Weizenbaum [ctb, cph] (LibSass library),\n Chris Eppstein [ctb, cph] (LibSass library),\n Adams Joseph [ctb, cph] (json.cpp),\n Trifunovic Nemanja [ctb, cph] (utf8.h)", - "Maintainer": "Carson Sievert ", - "Repository": "CRAN", - "Date/Publication": "2023-05-03 23:30:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-05-04 04:35:51 UTC; unix", - "Archs": "sass.so.dSYM" - } - }, - "stringi": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "stringi", - "Version": "1.7.12", - "Date": "2023-01-09", - "Title": "Fast and Portable Character String Processing Facilities", - "Description": "A collection of character string/text/natural language\n processing tools for pattern searching (e.g., with 'Java'-like regular\n expressions or the 'Unicode' collation algorithm), random string generation,\n case mapping, string transliteration, concatenation, sorting, padding,\n wrapping, Unicode normalisation, date-time formatting and parsing,\n and many more. They are fast, consistent, convenient, and -\n thanks to 'ICU' (International Components for Unicode) -\n portable across all locales and platforms. Documentation about 'stringi' is\n provided via its website at and\n the paper by Gagolewski (2022, ).", - "URL": "https://stringi.gagolewski.com/,\nhttps://github.com/gagolews/stringi, https://icu.unicode.org/", - "BugReports": "https://github.com/gagolews/stringi/issues", - "SystemRequirements": "C++11, ICU4C (>= 55, optional)", - "Type": "Package", - "Depends": "R (>= 3.1)", - "Imports": "tools, utils, stats", - "Biarch": "TRUE", - "License": "file LICENSE", - "Author": "Marek Gagolewski [aut, cre, cph] (),\n Bartek Tartanus [ctb], and others (stringi source code);\n Unicode, Inc. and others (ICU4C source code, Unicode Character Database)", - "Maintainer": "Marek Gagolewski ", - "RoxygenNote": "7.2.1", - "Encoding": "UTF-8", - "NeedsCompilation": "yes", - "Packaged": "2023-01-09 07:28:38 UTC; gagolews", - "License_is_FOSS": "yes", - "Repository": "CRAN", - "Date/Publication": "2023-01-11 10:10:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-11 20:20:49 UTC; unix" - } - }, - "stringr": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "stringr", - "Title": "Simple, Consistent Wrappers for Common String Operations", - "Version": "1.5.0", - "Authors@R": "\n c(person(given = \"Hadley\",\n family = \"Wickham\",\n role = c(\"aut\", \"cre\", \"cph\"),\n email = \"hadley@rstudio.com\"),\n person(given = \"RStudio\",\n role = c(\"cph\", \"fnd\")))", - "Description": "A consistent, simple and easy to use set of wrappers around\n the fantastic 'stringi' package. All function and argument names (and\n positions) are consistent, all functions deal with \"NA\"'s and zero\n length vectors in the same way, and the output from one function is\n easy to feed into the input of another.", - "License": "MIT + file LICENSE", - "URL": "https://stringr.tidyverse.org,\nhttps://github.com/tidyverse/stringr", - "BugReports": "https://github.com/tidyverse/stringr/issues", - "Depends": "R (>= 3.3)", - "Imports": "cli, glue (>= 1.6.1), lifecycle (>= 1.0.3), magrittr, rlang\n(>= 1.0.0), stringi (>= 1.5.3), vctrs", - "Suggests": "covr, htmltools, htmlwidgets, knitr, rmarkdown, testthat (>=\n3.0.0)", - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "LazyData": "true", - "RoxygenNote": "7.2.1", - "NeedsCompilation": "no", - "Packaged": "2022-12-01 20:53:42 UTC; hadleywickham", - "Author": "Hadley Wickham [aut, cre, cph],\n RStudio [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN", - "Date/Publication": "2022-12-02 10:20:02 UTC", - "Built": "R 4.3.0; ; 2023-04-12 12:50:56 UTC; unix" - } - }, - "tinytex": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "tinytex", - "Type": "Package", - "Title": "Helper Functions to Install and Maintain TeX Live, and Compile\nLaTeX Documents", - "Version": "0.45", - "Authors@R": "c(\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")),\n person(\"Christophe\", \"Dervieux\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")),\n person(\"Devon\", \"Ryan\", role = \"ctb\", email = \"dpryan79@gmail.com\", comment = c(ORCID = \"0000-0002-8549-0971\")),\n person(\"Ethan\", \"Heinzen\", role = \"ctb\"),\n person(\"Fernando\", \"Cagua\", role = \"ctb\"),\n person()\n )", - "Description": "Helper functions to install and maintain the 'LaTeX' distribution\n named 'TinyTeX' (), a lightweight, cross-platform,\n portable, and easy-to-maintain version of 'TeX Live'. This package also\n contains helper functions to compile 'LaTeX' documents, and install missing\n 'LaTeX' packages automatically.", - "Imports": "xfun (>= 0.29)", - "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.2.3", - "NeedsCompilation": "no", - "Packaged": "2023-04-18 13:52:40 UTC; yihui", - "Author": "Yihui Xie [aut, cre, cph] (),\n Posit Software, PBC [cph, fnd],\n Christophe Dervieux [ctb] (),\n Devon Ryan [ctb] (),\n Ethan Heinzen [ctb],\n Fernando Cagua [ctb]", - "Maintainer": "Yihui Xie ", - "Repository": "CRAN", - "Date/Publication": "2023-04-18 14:30:07 UTC", - "Built": "R 4.3.0; ; 2023-04-22 00:31:32 UTC; unix" - } - }, - "vctrs": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "vctrs", - "Title": "Vector Helpers", - "Version": "0.6.2", - "Authors@R": "c(\n person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"),\n person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"),\n person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")),\n person(\"data.table team\", role = \"cph\",\n comment = \"Radix sort based on data.table's forder() and their contribution to R's order()\"),\n person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n )", - "Description": "Defines new notions of prototype and size that are used to\n provide tools for consistent and well-founded type-coercion and\n size-recycling, and are in turn connected to ideas of type- and\n 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 (>= 3.5.0)", - "Imports": "cli (>= 3.4.0), glue, lifecycle (>= 1.0.3), rlang (>= 1.1.0)", - "Suggests": "bit64, covr, crayon, dplyr (>= 0.8.5), generics, knitr,\npillar (>= 1.4.4), pkgdown (>= 2.0.1), rmarkdown, testthat (>=\n3.0.0), tibble (>= 3.1.3), waldo (>= 0.2.0), withr, xml2,\nzeallot", - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "Language": "en-GB", - "RoxygenNote": "7.2.3", - "NeedsCompilation": "yes", - "Packaged": "2023-04-19 18:24:24 UTC; davis", - "Author": "Hadley Wickham [aut],\n Lionel Henry [aut],\n Davis Vaughan [aut, cre],\n data.table team [cph] (Radix sort based on data.table's forder() and\n their contribution to R's order()),\n Posit Software, PBC [cph, fnd]", - "Maintainer": "Davis Vaughan ", - "Repository": "CRAN", - "Date/Publication": "2023-04-19 19:30:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-22 00:48:35 UTC; unix", - "Archs": "vctrs.so.dSYM" - } - }, - "xfun": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "xfun", - "Type": "Package", - "Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'", - "Version": "0.39", - "Authors@R": "c(\n person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")),\n person(\"Wush\", \"Wu\", role = \"ctb\"),\n person(\"Daijiang\", \"Li\", role = \"ctb\"),\n person(\"Xianying\", \"Tan\", role = \"ctb\"),\n person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")),\n person(\"Christophe\", \"Dervieux\", role = \"ctb\"),\n person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")),\n person()\n )", - "Description": "Miscellaneous functions commonly used in other packages maintained by 'Yihui Xie'.", - "Imports": "stats, tools", - "Suggests": "testit, parallel, codetools, rstudioapi, tinytex (>= 0.30),\nmime, markdown (>= 1.5), knitr (>= 1.42), htmltools, remotes,\npak, rhub, renv, curl, jsonlite, magick, yaml, rmarkdown", - "License": "MIT + file LICENSE", - "URL": "https://github.com/yihui/xfun", - "BugReports": "https://github.com/yihui/xfun/issues", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.3", - "VignetteBuilder": "knitr", - "NeedsCompilation": "yes", - "Packaged": "2023-04-19 22:17:10 UTC; yihui", - "Author": "Yihui Xie [aut, cre, cph] (),\n Wush Wu [ctb],\n Daijiang Li [ctb],\n Xianying Tan [ctb],\n Salim Brüggemann [ctb] (),\n Christophe Dervieux [ctb],\n Posit Software, PBC [cph, fnd]", - "Maintainer": "Yihui Xie ", - "Repository": "CRAN", - "Date/Publication": "2023-04-20 12:50:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-22 00:00:24 UTC; unix", - "Archs": "xfun.so.dSYM" - } - }, - "yaml": { - "Source": "CRAN", - "Repository": "https://cran.rstudio.com", - "description": { - "Package": "yaml", - "Type": "Package", - "Title": "Methods to Convert R Data to YAML and Back", - "Date": "2023-01-18", - "Version": "2.3.7", - "Suggests": "RUnit", - "Author": "Shawn P Garbett [aut], Jeremy Stephens [aut, cre], Kirill Simonov [aut], Yihui Xie [ctb],\n Zhuoer Dong [ctb], Hadley Wickham [ctb], Jeffrey Horner [ctb], reikoch [ctb],\n Will Beasley [ctb], Brendan O'Connor [ctb], Gregory R. Warnes [ctb],\n Michael Quinn [ctb], Zhian N. Kamvar [ctb]", - "Maintainer": "Shawn Garbett ", - "License": "BSD_3_clause + file LICENSE", - "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter\n () for R.", - "URL": "https://github.com/vubiostat/r-yaml/", - "BugReports": "https://github.com/vubiostat/r-yaml/issues", - "NeedsCompilation": "yes", - "Packaged": "2023-01-18 17:20:16 UTC; garbetsp", - "Repository": "CRAN", - "Date/Publication": "2023-01-23 18:40:02 UTC", - "Built": "R 4.3.0; x86_64-apple-darwin20; 2023-04-08 21:18:13 UTC; unix", - "Archs": "yaml.so.dSYM" - } - } - }, - "files": { - "_site.yml": { - "checksum": "68b329da9893e34099c7d8ad5cb9c940" - }, - ".Rprofile": { - "checksum": "0b7556db576037033836dad462da03f7" - }, - "another.Rmd": { - "checksum": "3ff73b227b8d15e2b39172402234a0b6" - }, - "article.Rmd": { - "checksum": "c41a63e581ccf14e6e00ef8dab979765" - }, - "index.Rmd": { - "checksum": "c85dc46c45a93df8010830d238e4ff75" - }, - "meta.yaml": { - "checksum": "0824e67d283b321ee84d16fd194625d8" - } - }, - "users": null -} diff --git a/test/e2e/content-workspace/rmd-site/meta.yaml b/test/e2e/content-workspace/rmd-site/meta.yaml deleted file mode 100644 index 21c54d2909..0000000000 --- a/test/e2e/content-workspace/rmd-site/meta.yaml +++ /dev/null @@ -1,10 +0,0 @@ -tags: - - provisioner - - r - - rmd - - site - - static - - dev-env - - small-dev-env - - regression - - all diff --git a/test/e2e/content-workspace/rmd-site/renv.lock b/test/e2e/content-workspace/rmd-site/renv.lock deleted file mode 100644 index 54fd9f5377..0000000000 --- a/test/e2e/content-workspace/rmd-site/renv.lock +++ /dev/null @@ -1,398 +0,0 @@ -{ - "R": { - "Version": "4.3.1", - "Repositories": [ - { - "Name": "CRAN", - "URL": "https://packagemanager.posit.co/cran/latest" - } - ] - }, - "Packages": { - "R6": { - "Package": "R6", - "Version": "2.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "470851b6d5d0ac559e9d01bb352b4021" - }, - "base64enc": { - "Package": "base64enc", - "Version": "0.1-3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "543776ae6848fde2f48ff3816d0628bc" - }, - "bslib": { - "Package": "bslib", - "Version": "0.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "base64enc", - "cachem", - "grDevices", - "htmltools", - "jquerylib", - "jsonlite", - "memoise", - "mime", - "rlang", - "sass" - ], - "Hash": "283015ddfbb9d7bf15ea9f0b5698f0d9" - }, - "cachem": { - "Package": "cachem", - "Version": "1.0.8", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "fastmap", - "rlang" - ], - "Hash": "c35768291560ce302c0a6589f92e837d" - }, - "cli": { - "Package": "cli", - "Version": "3.6.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "1216ac65ac55ec0058a6f75d7ca0fd52" - }, - "digest": { - "Package": "digest", - "Version": "0.6.35", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "698ece7ba5a4fa4559e3d537e7ec3d31" - }, - "ellipsis": { - "Package": "ellipsis", - "Version": "0.3.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "rlang" - ], - "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077" - }, - "evaluate": { - "Package": "evaluate", - "Version": "0.22", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "66f39c7a21e03c4dcb2c2d21d738d603" - }, - "fastmap": { - "Package": "fastmap", - "Version": "1.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "f7736a18de97dea803bde0a2daaafb27" - }, - "fontawesome": { - "Package": "fontawesome", - "Version": "0.5.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "htmltools", - "rlang" - ], - "Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d" - }, - "fs": { - "Package": "fs", - "Version": "1.6.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "15aeb8c27f5ea5161f9f6a641fafd93a" - }, - "glue": { - "Package": "glue", - "Version": "1.7.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "e0b3a53876554bd45879e596cdb10a52" - }, - "highr": { - "Package": "highr", - "Version": "0.10", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "xfun" - ], - "Hash": "06230136b2d2b9ba5805e1963fa6e890" - }, - "htmltools": { - "Package": "htmltools", - "Version": "0.5.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "base64enc", - "digest", - "ellipsis", - "fastmap", - "grDevices", - "rlang", - "utils" - ], - "Hash": "a2326a66919a3311f7fbb1e3bf568283" - }, - "jquerylib": { - "Package": "jquerylib", - "Version": "0.1.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "htmltools" - ], - "Hash": "5aab57a3bd297eee1c1d862735972182" - }, - "jsonlite": { - "Package": "jsonlite", - "Version": "1.8.8", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "methods" - ], - "Hash": "e1b9c55281c5adc4dd113652d9e26768" - }, - "knitr": { - "Package": "knitr", - "Version": "1.44", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "evaluate", - "highr", - "methods", - "tools", - "xfun", - "yaml" - ], - "Hash": "60885b9f746c9dfaef110d070b5f7dc0" - }, - "lifecycle": { - "Package": "lifecycle", - "Version": "1.0.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "rlang" - ], - "Hash": "b8552d117e1b808b09a832f589b79035" - }, - "magrittr": { - "Package": "magrittr", - "Version": "2.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "7ce2733a9826b3aeb1775d56fd305472" - }, - "memoise": { - "Package": "memoise", - "Version": "2.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cachem", - "rlang" - ], - "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" - }, - "mime": { - "Package": "mime", - "Version": "0.12", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "tools" - ], - "Hash": "18e9c28c1d3ca1560ce30658b22ce104" - }, - "rappdirs": { - "Package": "rappdirs", - "Version": "0.3.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "5e3c5dc0b071b21fa128676560dbe94d" - }, - "renv": { - "Package": "renv", - "Version": "1.0.7", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "utils" - ], - "Hash": "397b7b2a265bc5a7a06852524dabae20" - }, - "rlang": { - "Package": "rlang", - "Version": "1.1.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "42548638fae05fd9a9b5f3f437fbbbe2" - }, - "rmarkdown": { - "Package": "rmarkdown", - "Version": "2.25", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bslib", - "evaluate", - "fontawesome", - "htmltools", - "jquerylib", - "jsonlite", - "knitr", - "methods", - "stringr", - "tinytex", - "tools", - "utils", - "xfun", - "yaml" - ], - "Hash": "d65e35823c817f09f4de424fcdfa812a" - }, - "sass": { - "Package": "sass", - "Version": "0.4.7", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R6", - "fs", - "htmltools", - "rappdirs", - "rlang" - ], - "Hash": "6bd4d33b50ff927191ec9acbf52fd056" - }, - "stringi": { - "Package": "stringi", - "Version": "1.7.12", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "stats", - "tools", - "utils" - ], - "Hash": "ca8bd84263c77310739d2cf64d84d7c9" - }, - "stringr": { - "Package": "stringr", - "Version": "1.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "magrittr", - "rlang", - "stringi", - "vctrs" - ], - "Hash": "671a4d384ae9d32fc47a14e98bfa3dc8" - }, - "tinytex": { - "Package": "tinytex", - "Version": "0.47", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "xfun" - ], - "Hash": "8d4ccb733843e513c1c1cdd66a759f0d" - }, - "vctrs": { - "Package": "vctrs", - "Version": "0.6.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "rlang" - ], - "Hash": "c03fa420630029418f7e6da3667aac4a" - }, - "xfun": { - "Package": "xfun", - "Version": "0.40", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "stats", - "tools" - ], - "Hash": "be07d23211245fc7d4209f54c4e4ffc8" - }, - "yaml": { - "Package": "yaml", - "Version": "2.3.8", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "29240487a071f535f5e5d5a323b7afbd" - } - } -} diff --git a/test/e2e/content-workspace/rmd-site/renv/.gitignore b/test/e2e/content-workspace/rmd-site/renv/.gitignore deleted file mode 100644 index 0ec0cbba2d..0000000000 --- a/test/e2e/content-workspace/rmd-site/renv/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -library/ -local/ -cellar/ -lock/ -python/ -sandbox/ -staging/ diff --git a/test/e2e/content-workspace/rmd-site/renv/activate.R b/test/e2e/content-workspace/rmd-site/renv/activate.R deleted file mode 100644 index d13f9932a1..0000000000 --- a/test/e2e/content-workspace/rmd-site/renv/activate.R +++ /dev/null @@ -1,1220 +0,0 @@ - -local({ - - # the requested version of renv - version <- "1.0.7" - attr(version, "sha") <- NULL - - # the project directory - project <- Sys.getenv("RENV_PROJECT") - if (!nzchar(project)) - project <- getwd() - - # use start-up diagnostics if enabled - diagnostics <- Sys.getenv("RENV_STARTUP_DIAGNOSTICS", unset = "FALSE") - if (diagnostics) { - start <- Sys.time() - profile <- tempfile("renv-startup-", fileext = ".Rprof") - utils::Rprof(profile) - on.exit({ - utils::Rprof(NULL) - elapsed <- signif(difftime(Sys.time(), start, units = "auto"), digits = 2L) - writeLines(sprintf("- renv took %s to run the autoloader.", format(elapsed))) - writeLines(sprintf("- Profile: %s", profile)) - print(utils::summaryRprof(profile)) - }, add = TRUE) - } - - # figure out whether the autoloader is enabled - enabled <- local({ - - # first, check config option - override <- getOption("renv.config.autoloader.enabled") - if (!is.null(override)) - return(override) - - # if we're being run in a context where R_LIBS is already set, - # don't load -- presumably we're being run as a sub-process and - # the parent process has already set up library paths for us - rcmd <- Sys.getenv("R_CMD", unset = NA) - rlibs <- Sys.getenv("R_LIBS", unset = NA) - if (!is.na(rlibs) && !is.na(rcmd)) - return(FALSE) - - # next, check environment variables - # TODO: prefer using the configuration one in the future - envvars <- c( - "RENV_CONFIG_AUTOLOADER_ENABLED", - "RENV_AUTOLOADER_ENABLED", - "RENV_ACTIVATE_PROJECT" - ) - - for (envvar in envvars) { - envval <- Sys.getenv(envvar, unset = NA) - if (!is.na(envval)) - return(tolower(envval) %in% c("true", "t", "1")) - } - - # enable by default - TRUE - - }) - - # bail if we're not enabled - if (!enabled) { - - # if we're not enabled, we might still need to manually load - # the user profile here - profile <- Sys.getenv("R_PROFILE_USER", unset = "~/.Rprofile") - if (file.exists(profile)) { - cfg <- Sys.getenv("RENV_CONFIG_USER_PROFILE", unset = "TRUE") - if (tolower(cfg) %in% c("true", "t", "1")) - sys.source(profile, envir = globalenv()) - } - - return(FALSE) - - } - - # avoid recursion - if (identical(getOption("renv.autoloader.running"), TRUE)) { - warning("ignoring recursive attempt to run renv autoloader") - return(invisible(TRUE)) - } - - # signal that we're loading renv during R startup - options(renv.autoloader.running = TRUE) - on.exit(options(renv.autoloader.running = NULL), add = TRUE) - - # signal that we've consented to use renv - options(renv.consent = TRUE) - - # load the 'utils' package eagerly -- this ensures that renv shims, which - # mask 'utils' packages, will come first on the search path - library(utils, lib.loc = .Library) - - # unload renv if it's already been loaded - if ("renv" %in% loadedNamespaces()) - unloadNamespace("renv") - - # load bootstrap tools - `%||%` <- function(x, y) { - if (is.null(x)) y else x - } - - catf <- function(fmt, ..., appendLF = TRUE) { - - quiet <- getOption("renv.bootstrap.quiet", default = FALSE) - if (quiet) - return(invisible()) - - msg <- sprintf(fmt, ...) - cat(msg, file = stdout(), sep = if (appendLF) "\n" else "") - - invisible(msg) - - } - - header <- function(label, - ..., - prefix = "#", - suffix = "-", - n = min(getOption("width"), 78)) - { - label <- sprintf(label, ...) - n <- max(n - nchar(label) - nchar(prefix) - 2L, 8L) - if (n <= 0) - return(paste(prefix, label)) - - tail <- paste(rep.int(suffix, n), collapse = "") - paste0(prefix, " ", label, " ", tail) - - } - - heredoc <- function(text, leave = 0) { - - # remove leading, trailing whitespace - trimmed <- gsub("^\\s*\\n|\\n\\s*$", "", text) - - # split into lines - lines <- strsplit(trimmed, "\n", fixed = TRUE)[[1L]] - - # compute common indent - indent <- regexpr("[^[:space:]]", lines) - common <- min(setdiff(indent, -1L)) - leave - paste(substring(lines, common), collapse = "\n") - - } - - startswith <- function(string, prefix) { - substring(string, 1, nchar(prefix)) == prefix - } - - bootstrap <- function(version, library) { - - friendly <- renv_bootstrap_version_friendly(version) - section <- header(sprintf("Bootstrapping renv %s", friendly)) - catf(section) - - # attempt to download renv - catf("- Downloading renv ... ", appendLF = FALSE) - withCallingHandlers( - tarball <- renv_bootstrap_download(version), - error = function(err) { - catf("FAILED") - stop("failed to download:\n", conditionMessage(err)) - } - ) - catf("OK") - on.exit(unlink(tarball), add = TRUE) - - # now attempt to install - catf("- Installing renv ... ", appendLF = FALSE) - withCallingHandlers( - status <- renv_bootstrap_install(version, tarball, library), - error = function(err) { - catf("FAILED") - stop("failed to install:\n", conditionMessage(err)) - } - ) - catf("OK") - - # add empty line to break up bootstrapping from normal output - catf("") - - return(invisible()) - } - - renv_bootstrap_tests_running <- function() { - getOption("renv.tests.running", default = FALSE) - } - - renv_bootstrap_repos <- function() { - - # get CRAN repository - cran <- getOption("renv.repos.cran", "https://cloud.r-project.org") - - # check for repos override - repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) - if (!is.na(repos)) { - - # check for RSPM; if set, use a fallback repository for renv - rspm <- Sys.getenv("RSPM", unset = NA) - if (identical(rspm, repos)) - repos <- c(RSPM = rspm, CRAN = cran) - - return(repos) - - } - - # check for lockfile repositories - repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) - if (!inherits(repos, "error") && length(repos)) - return(repos) - - # retrieve current repos - repos <- getOption("repos") - - # ensure @CRAN@ entries are resolved - repos[repos == "@CRAN@"] <- cran - - # add in renv.bootstrap.repos if set - default <- c(FALLBACK = "https://cloud.r-project.org") - extra <- getOption("renv.bootstrap.repos", default = default) - repos <- c(repos, extra) - - # remove duplicates that might've snuck in - dupes <- duplicated(repos) | duplicated(names(repos)) - repos[!dupes] - - } - - renv_bootstrap_repos_lockfile <- function() { - - lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock") - if (!file.exists(lockpath)) - return(NULL) - - lockfile <- tryCatch(renv_json_read(lockpath), error = identity) - if (inherits(lockfile, "error")) { - warning(lockfile) - return(NULL) - } - - repos <- lockfile$R$Repositories - if (length(repos) == 0) - return(NULL) - - keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1)) - vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1)) - names(vals) <- keys - - return(vals) - - } - - renv_bootstrap_download <- function(version) { - - sha <- attr(version, "sha", exact = TRUE) - - methods <- if (!is.null(sha)) { - - # attempting to bootstrap a development version of renv - c( - function() renv_bootstrap_download_tarball(sha), - function() renv_bootstrap_download_github(sha) - ) - - } else { - - # attempting to bootstrap a release version of renv - c( - function() renv_bootstrap_download_tarball(version), - function() renv_bootstrap_download_cran_latest(version), - function() renv_bootstrap_download_cran_archive(version) - ) - - } - - for (method in methods) { - path <- tryCatch(method(), error = identity) - if (is.character(path) && file.exists(path)) - return(path) - } - - stop("All download methods failed") - - } - - renv_bootstrap_download_impl <- function(url, destfile) { - - mode <- "wb" - - # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715 - fixup <- - Sys.info()[["sysname"]] == "Windows" && - substring(url, 1L, 5L) == "file:" - - if (fixup) - mode <- "w+b" - - args <- list( - url = url, - destfile = destfile, - mode = mode, - quiet = TRUE - ) - - if ("headers" %in% names(formals(utils::download.file))) - args$headers <- renv_bootstrap_download_custom_headers(url) - - do.call(utils::download.file, args) - - } - - renv_bootstrap_download_custom_headers <- function(url) { - - headers <- getOption("renv.download.headers") - if (is.null(headers)) - return(character()) - - if (!is.function(headers)) - stopf("'renv.download.headers' is not a function") - - headers <- headers(url) - if (length(headers) == 0L) - return(character()) - - if (is.list(headers)) - headers <- unlist(headers, recursive = FALSE, use.names = TRUE) - - ok <- - is.character(headers) && - is.character(names(headers)) && - all(nzchar(names(headers))) - - if (!ok) - stop("invocation of 'renv.download.headers' did not return a named character vector") - - headers - - } - - renv_bootstrap_download_cran_latest <- function(version) { - - spec <- renv_bootstrap_download_cran_latest_find(version) - type <- spec$type - repos <- spec$repos - - baseurl <- utils::contrib.url(repos = repos, type = type) - ext <- if (identical(type, "source")) - ".tar.gz" - else if (Sys.info()[["sysname"]] == "Windows") - ".zip" - else - ".tgz" - name <- sprintf("renv_%s%s", version, ext) - url <- paste(baseurl, name, sep = "/") - - destfile <- file.path(tempdir(), name) - status <- tryCatch( - renv_bootstrap_download_impl(url, destfile), - condition = identity - ) - - if (inherits(status, "condition")) - return(FALSE) - - # report success and return - destfile - - } - - renv_bootstrap_download_cran_latest_find <- function(version) { - - # check whether binaries are supported on this system - binary <- - getOption("renv.bootstrap.binary", default = TRUE) && - !identical(.Platform$pkgType, "source") && - !identical(getOption("pkgType"), "source") && - Sys.info()[["sysname"]] %in% c("Darwin", "Windows") - - types <- c(if (binary) "binary", "source") - - # iterate over types + repositories - for (type in types) { - for (repos in renv_bootstrap_repos()) { - - # retrieve package database - db <- tryCatch( - as.data.frame( - utils::available.packages(type = type, repos = repos), - stringsAsFactors = FALSE - ), - error = identity - ) - - if (inherits(db, "error")) - next - - # check for compatible entry - entry <- db[db$Package %in% "renv" & db$Version %in% version, ] - if (nrow(entry) == 0) - next - - # found it; return spec to caller - spec <- list(entry = entry, type = type, repos = repos) - return(spec) - - } - } - - # if we got here, we failed to find renv - fmt <- "renv %s is not available from your declared package repositories" - stop(sprintf(fmt, version)) - - } - - renv_bootstrap_download_cran_archive <- function(version) { - - name <- sprintf("renv_%s.tar.gz", version) - repos <- renv_bootstrap_repos() - urls <- file.path(repos, "src/contrib/Archive/renv", name) - destfile <- file.path(tempdir(), name) - - for (url in urls) { - - status <- tryCatch( - renv_bootstrap_download_impl(url, destfile), - condition = identity - ) - - if (identical(status, 0L)) - return(destfile) - - } - - return(FALSE) - - } - - renv_bootstrap_download_tarball <- function(version) { - - # if the user has provided the path to a tarball via - # an environment variable, then use it - tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA) - if (is.na(tarball)) - return() - - # allow directories - if (dir.exists(tarball)) { - name <- sprintf("renv_%s.tar.gz", version) - tarball <- file.path(tarball, name) - } - - # bail if it doesn't exist - if (!file.exists(tarball)) { - - # let the user know we weren't able to honour their request - fmt <- "- RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." - msg <- sprintf(fmt, tarball) - warning(msg) - - # bail - return() - - } - - catf("- Using local tarball '%s'.", tarball) - tarball - - } - - renv_bootstrap_download_github <- function(version) { - - enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") - if (!identical(enabled, "TRUE")) - return(FALSE) - - # prepare download options - pat <- Sys.getenv("GITHUB_PAT") - if (nzchar(Sys.which("curl")) && nzchar(pat)) { - fmt <- "--location --fail --header \"Authorization: token %s\"" - extra <- sprintf(fmt, pat) - saved <- options("download.file.method", "download.file.extra") - options(download.file.method = "curl", download.file.extra = extra) - on.exit(do.call(base::options, saved), add = TRUE) - } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { - fmt <- "--header=\"Authorization: token %s\"" - extra <- sprintf(fmt, pat) - saved <- options("download.file.method", "download.file.extra") - options(download.file.method = "wget", download.file.extra = extra) - on.exit(do.call(base::options, saved), add = TRUE) - } - - url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) - name <- sprintf("renv_%s.tar.gz", version) - destfile <- file.path(tempdir(), name) - - status <- tryCatch( - renv_bootstrap_download_impl(url, destfile), - condition = identity - ) - - if (!identical(status, 0L)) - return(FALSE) - - renv_bootstrap_download_augment(destfile) - - return(destfile) - - } - - # Add Sha to DESCRIPTION. This is stop gap until #890, after which we - # can use renv::install() to fully capture metadata. - renv_bootstrap_download_augment <- function(destfile) { - sha <- renv_bootstrap_git_extract_sha1_tar(destfile) - if (is.null(sha)) { - return() - } - - # Untar - tempdir <- tempfile("renv-github-") - on.exit(unlink(tempdir, recursive = TRUE), add = TRUE) - untar(destfile, exdir = tempdir) - pkgdir <- dir(tempdir, full.names = TRUE)[[1]] - - # Modify description - desc_path <- file.path(pkgdir, "DESCRIPTION") - desc_lines <- readLines(desc_path) - remotes_fields <- c( - "RemoteType: github", - "RemoteHost: api.github.com", - "RemoteRepo: renv", - "RemoteUsername: rstudio", - "RemotePkgRef: rstudio/renv", - paste("RemoteRef: ", sha), - paste("RemoteSha: ", sha) - ) - writeLines(c(desc_lines[desc_lines != ""], remotes_fields), con = desc_path) - - # Re-tar - local({ - old <- setwd(tempdir) - on.exit(setwd(old), add = TRUE) - - tar(destfile, compression = "gzip") - }) - invisible() - } - - # Extract the commit hash from a git archive. Git archives include the SHA1 - # hash as the comment field of the tarball pax extended header - # (see https://www.kernel.org/pub/software/scm/git/docs/git-archive.html) - # For GitHub archives this should be the first header after the default one - # (512 byte) header. - renv_bootstrap_git_extract_sha1_tar <- function(bundle) { - - # open the bundle for reading - # We use gzcon for everything because (from ?gzcon) - # > Reading from a connection which does not supply a 'gzip' magic - # > header is equivalent to reading from the original connection - conn <- gzcon(file(bundle, open = "rb", raw = TRUE)) - on.exit(close(conn)) - - # The default pax header is 512 bytes long and the first pax extended header - # with the comment should be 51 bytes long - # `52 comment=` (11 chars) + 40 byte SHA1 hash - len <- 0x200 + 0x33 - res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len]) - - if (grepl("^52 comment=", res)) { - sub("52 comment=", "", res) - } else { - NULL - } - } - - renv_bootstrap_install <- function(version, tarball, library) { - - # attempt to install it into project library - dir.create(library, showWarnings = FALSE, recursive = TRUE) - output <- renv_bootstrap_install_impl(library, tarball) - - # check for successful install - status <- attr(output, "status") - if (is.null(status) || identical(status, 0L)) - return(status) - - # an error occurred; report it - header <- "installation of renv failed" - lines <- paste(rep.int("=", nchar(header)), collapse = "") - text <- paste(c(header, lines, output), collapse = "\n") - stop(text) - - } - - renv_bootstrap_install_impl <- function(library, tarball) { - - # invoke using system2 so we can capture and report output - bin <- R.home("bin") - exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" - R <- file.path(bin, exe) - - args <- c( - "--vanilla", "CMD", "INSTALL", "--no-multiarch", - "-l", shQuote(path.expand(library)), - shQuote(path.expand(tarball)) - ) - - system2(R, args, stdout = TRUE, stderr = TRUE) - - } - - renv_bootstrap_platform_prefix <- function() { - - # construct version prefix - version <- paste(R.version$major, R.version$minor, sep = ".") - prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-") - - # include SVN revision for development versions of R - # (to avoid sharing platform-specific artefacts with released versions of R) - devel <- - identical(R.version[["status"]], "Under development (unstable)") || - identical(R.version[["nickname"]], "Unsuffered Consequences") - - if (devel) - prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") - - # build list of path components - components <- c(prefix, R.version$platform) - - # include prefix if provided by user - prefix <- renv_bootstrap_platform_prefix_impl() - if (!is.na(prefix) && nzchar(prefix)) - components <- c(prefix, components) - - # build prefix - paste(components, collapse = "/") - - } - - renv_bootstrap_platform_prefix_impl <- function() { - - # if an explicit prefix has been supplied, use it - prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA) - if (!is.na(prefix)) - return(prefix) - - # if the user has requested an automatic prefix, generate it - auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) - if (is.na(auto) && getRversion() >= "4.4.0") - auto <- "TRUE" - - if (auto %in% c("TRUE", "True", "true", "1")) - return(renv_bootstrap_platform_prefix_auto()) - - # empty string on failure - "" - - } - - renv_bootstrap_platform_prefix_auto <- function() { - - prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity) - if (inherits(prefix, "error") || prefix %in% "unknown") { - - msg <- paste( - "failed to infer current operating system", - "please file a bug report at https://github.com/rstudio/renv/issues", - sep = "; " - ) - - warning(msg) - - } - - prefix - - } - - renv_bootstrap_platform_os <- function() { - - sysinfo <- Sys.info() - sysname <- sysinfo[["sysname"]] - - # handle Windows + macOS up front - if (sysname == "Windows") - return("windows") - else if (sysname == "Darwin") - return("macos") - - # check for os-release files - for (file in c("/etc/os-release", "/usr/lib/os-release")) - if (file.exists(file)) - return(renv_bootstrap_platform_os_via_os_release(file, sysinfo)) - - # check for redhat-release files - if (file.exists("/etc/redhat-release")) - return(renv_bootstrap_platform_os_via_redhat_release()) - - "unknown" - - } - - renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) { - - # read /etc/os-release - release <- utils::read.table( - file = file, - sep = "=", - quote = c("\"", "'"), - col.names = c("Key", "Value"), - comment.char = "#", - stringsAsFactors = FALSE - ) - - vars <- as.list(release$Value) - names(vars) <- release$Key - - # get os name - os <- tolower(sysinfo[["sysname"]]) - - # read id - id <- "unknown" - for (field in c("ID", "ID_LIKE")) { - if (field %in% names(vars) && nzchar(vars[[field]])) { - id <- vars[[field]] - break - } - } - - # read version - version <- "unknown" - for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) { - if (field %in% names(vars) && nzchar(vars[[field]])) { - version <- vars[[field]] - break - } - } - - # join together - paste(c(os, id, version), collapse = "-") - - } - - renv_bootstrap_platform_os_via_redhat_release <- function() { - - # read /etc/redhat-release - contents <- readLines("/etc/redhat-release", warn = FALSE) - - # infer id - id <- if (grepl("centos", contents, ignore.case = TRUE)) - "centos" - else if (grepl("redhat", contents, ignore.case = TRUE)) - "redhat" - else - "unknown" - - # try to find a version component (very hacky) - version <- "unknown" - - parts <- strsplit(contents, "[[:space:]]")[[1L]] - for (part in parts) { - - nv <- tryCatch(numeric_version(part), error = identity) - if (inherits(nv, "error")) - next - - version <- nv[1, 1] - break - - } - - paste(c("linux", id, version), collapse = "-") - - } - - renv_bootstrap_library_root_name <- function(project) { - - # use project name as-is if requested - asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE") - if (asis) - return(basename(project)) - - # otherwise, disambiguate based on project's path - id <- substring(renv_bootstrap_hash_text(project), 1L, 8L) - paste(basename(project), id, sep = "-") - - } - - renv_bootstrap_library_root <- function(project) { - - prefix <- renv_bootstrap_profile_prefix() - - path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA) - if (!is.na(path)) - return(paste(c(path, prefix), collapse = "/")) - - path <- renv_bootstrap_library_root_impl(project) - if (!is.null(path)) { - name <- renv_bootstrap_library_root_name(project) - return(paste(c(path, prefix, name), collapse = "/")) - } - - renv_bootstrap_paths_renv("library", project = project) - - } - - renv_bootstrap_library_root_impl <- function(project) { - - root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) - if (!is.na(root)) - return(root) - - type <- renv_bootstrap_project_type(project) - if (identical(type, "package")) { - userdir <- renv_bootstrap_user_dir() - return(file.path(userdir, "library")) - } - - } - - renv_bootstrap_validate_version <- function(version, description = NULL) { - - # resolve description file - # - # avoid passing lib.loc to `packageDescription()` below, since R will - # use the loaded version of the package by default anyhow. note that - # this function should only be called after 'renv' is loaded - # https://github.com/rstudio/renv/issues/1625 - description <- description %||% packageDescription("renv") - - # check whether requested version 'version' matches loaded version of renv - sha <- attr(version, "sha", exact = TRUE) - valid <- if (!is.null(sha)) - renv_bootstrap_validate_version_dev(sha, description) - else - renv_bootstrap_validate_version_release(version, description) - - if (valid) - return(TRUE) - - # the loaded version of renv doesn't match the requested version; - # give the user instructions on how to proceed - dev <- identical(description[["RemoteType"]], "github") - remote <- if (dev) - paste("rstudio/renv", description[["RemoteSha"]], sep = "@") - else - paste("renv", description[["Version"]], sep = "@") - - # display both loaded version + sha if available - friendly <- renv_bootstrap_version_friendly( - version = description[["Version"]], - sha = if (dev) description[["RemoteSha"]] - ) - - fmt <- heredoc(" - renv %1$s was loaded from project library, but this project is configured to use renv %2$s. - - Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile. - - Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library. - ") - catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote) - - FALSE - - } - - renv_bootstrap_validate_version_dev <- function(version, description) { - expected <- description[["RemoteSha"]] - is.character(expected) && startswith(expected, version) - } - - renv_bootstrap_validate_version_release <- function(version, description) { - expected <- description[["Version"]] - is.character(expected) && identical(expected, version) - } - - renv_bootstrap_hash_text <- function(text) { - - hashfile <- tempfile("renv-hash-") - on.exit(unlink(hashfile), add = TRUE) - - writeLines(text, con = hashfile) - tools::md5sum(hashfile) - - } - - renv_bootstrap_load <- function(project, libpath, version) { - - # try to load renv from the project library - if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) - return(FALSE) - - # warn if the version of renv loaded does not match - renv_bootstrap_validate_version(version) - - # execute renv load hooks, if any - hooks <- getHook("renv::autoload") - for (hook in hooks) - if (is.function(hook)) - tryCatch(hook(), error = warnify) - - # load the project - renv::load(project) - - TRUE - - } - - renv_bootstrap_profile_load <- function(project) { - - # if RENV_PROFILE is already set, just use that - profile <- Sys.getenv("RENV_PROFILE", unset = NA) - if (!is.na(profile) && nzchar(profile)) - return(profile) - - # check for a profile file (nothing to do if it doesn't exist) - path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project) - if (!file.exists(path)) - return(NULL) - - # read the profile, and set it if it exists - contents <- readLines(path, warn = FALSE) - if (length(contents) == 0L) - return(NULL) - - # set RENV_PROFILE - profile <- contents[[1L]] - if (!profile %in% c("", "default")) - Sys.setenv(RENV_PROFILE = profile) - - profile - - } - - renv_bootstrap_profile_prefix <- function() { - profile <- renv_bootstrap_profile_get() - if (!is.null(profile)) - return(file.path("profiles", profile, "renv")) - } - - renv_bootstrap_profile_get <- function() { - profile <- Sys.getenv("RENV_PROFILE", unset = "") - renv_bootstrap_profile_normalize(profile) - } - - renv_bootstrap_profile_set <- function(profile) { - profile <- renv_bootstrap_profile_normalize(profile) - if (is.null(profile)) - Sys.unsetenv("RENV_PROFILE") - else - Sys.setenv(RENV_PROFILE = profile) - } - - renv_bootstrap_profile_normalize <- function(profile) { - - if (is.null(profile) || profile %in% c("", "default")) - return(NULL) - - profile - - } - - renv_bootstrap_path_absolute <- function(path) { - - substr(path, 1L, 1L) %in% c("~", "/", "\\") || ( - substr(path, 1L, 1L) %in% c(letters, LETTERS) && - substr(path, 2L, 3L) %in% c(":/", ":\\") - ) - - } - - renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) { - renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv") - root <- if (renv_bootstrap_path_absolute(renv)) NULL else project - prefix <- if (profile) renv_bootstrap_profile_prefix() - components <- c(root, renv, prefix, ...) - paste(components, collapse = "/") - } - - renv_bootstrap_project_type <- function(path) { - - descpath <- file.path(path, "DESCRIPTION") - if (!file.exists(descpath)) - return("unknown") - - desc <- tryCatch( - read.dcf(descpath, all = TRUE), - error = identity - ) - - if (inherits(desc, "error")) - return("unknown") - - type <- desc$Type - if (!is.null(type)) - return(tolower(type)) - - package <- desc$Package - if (!is.null(package)) - return("package") - - "unknown" - - } - - renv_bootstrap_user_dir <- function() { - dir <- renv_bootstrap_user_dir_impl() - path.expand(chartr("\\", "/", dir)) - } - - renv_bootstrap_user_dir_impl <- function() { - - # use local override if set - override <- getOption("renv.userdir.override") - if (!is.null(override)) - return(override) - - # use R_user_dir if available - tools <- asNamespace("tools") - if (is.function(tools$R_user_dir)) - return(tools$R_user_dir("renv", "cache")) - - # try using our own backfill for older versions of R - envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME") - for (envvar in envvars) { - root <- Sys.getenv(envvar, unset = NA) - if (!is.na(root)) - return(file.path(root, "R/renv")) - } - - # use platform-specific default fallbacks - if (Sys.info()[["sysname"]] == "Windows") - file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv") - else if (Sys.info()[["sysname"]] == "Darwin") - "~/Library/Caches/org.R-project.R/R/renv" - else - "~/.cache/R/renv" - - } - - renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) { - sha <- sha %||% attr(version, "sha", exact = TRUE) - parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L))) - paste(parts, collapse = "") - } - - renv_bootstrap_exec <- function(project, libpath, version) { - if (!renv_bootstrap_load(project, libpath, version)) - renv_bootstrap_run(version, libpath) - } - - renv_bootstrap_run <- function(version, libpath) { - - # perform bootstrap - bootstrap(version, libpath) - - # exit early if we're just testing bootstrap - if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) - return(TRUE) - - # try again to load - if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - return(renv::load(project = getwd())) - } - - # failed to download or load renv; warn the user - msg <- c( - "Failed to find an renv installation: the project will not be loaded.", - "Use `renv::activate()` to re-initialize the project." - ) - - warning(paste(msg, collapse = "\n"), call. = FALSE) - - } - - renv_json_read <- function(file = NULL, text = NULL) { - - jlerr <- NULL - - # if jsonlite is loaded, use that instead - if ("jsonlite" %in% loadedNamespaces()) { - - json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity) - if (!inherits(json, "error")) - return(json) - - jlerr <- json - - } - - # otherwise, fall back to the default JSON reader - json <- tryCatch(renv_json_read_default(file, text), error = identity) - if (!inherits(json, "error")) - return(json) - - # report an error - if (!is.null(jlerr)) - stop(jlerr) - else - stop(json) - - } - - renv_json_read_jsonlite <- function(file = NULL, text = NULL) { - text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") - jsonlite::fromJSON(txt = text, simplifyVector = FALSE) - } - - renv_json_read_default <- function(file = NULL, text = NULL) { - - # find strings in the JSON - text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") - pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' - locs <- gregexpr(pattern, text, perl = TRUE)[[1]] - - # if any are found, replace them with placeholders - replaced <- text - strings <- character() - replacements <- character() - - if (!identical(c(locs), -1L)) { - - # get the string values - starts <- locs - ends <- locs + attr(locs, "match.length") - 1L - strings <- substring(text, starts, ends) - - # only keep those requiring escaping - strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE) - - # compute replacements - replacements <- sprintf('"\032%i\032"', seq_along(strings)) - - # replace the strings - mapply(function(string, replacement) { - replaced <<- sub(string, replacement, replaced, fixed = TRUE) - }, strings, replacements) - - } - - # transform the JSON into something the R parser understands - transformed <- replaced - transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE) - transformed <- gsub("[[{]", "list(", transformed, perl = TRUE) - transformed <- gsub("[]}]", ")", transformed, perl = TRUE) - transformed <- gsub(":", "=", transformed, fixed = TRUE) - text <- paste(transformed, collapse = "\n") - - # parse it - json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]] - - # construct map between source strings, replaced strings - map <- as.character(parse(text = strings)) - names(map) <- as.character(parse(text = replacements)) - - # convert to list - map <- as.list(map) - - # remap strings in object - remapped <- renv_json_read_remap(json, map) - - # evaluate - eval(remapped, envir = baseenv()) - - } - - renv_json_read_remap <- function(json, map) { - - # fix names - if (!is.null(names(json))) { - lhs <- match(names(json), names(map), nomatch = 0L) - rhs <- match(names(map), names(json), nomatch = 0L) - names(json)[rhs] <- map[lhs] - } - - # fix values - if (is.character(json)) - return(map[[json]] %||% json) - - # handle true, false, null - if (is.name(json)) { - text <- as.character(json) - if (text == "true") - return(TRUE) - else if (text == "false") - return(FALSE) - else if (text == "null") - return(NULL) - } - - # recurse - if (is.recursive(json)) { - for (i in seq_along(json)) { - json[i] <- list(renv_json_read_remap(json[[i]], map)) - } - } - - json - - } - - # load the renv profile, if any - renv_bootstrap_profile_load(project) - - # construct path to library root - root <- renv_bootstrap_library_root(project) - - # construct library prefix for platform - prefix <- renv_bootstrap_platform_prefix() - - # construct full libpath - libpath <- file.path(root, prefix) - - # run bootstrap code - renv_bootstrap_exec(project, libpath, version) - - invisible() - -}) diff --git a/test/e2e/content-workspace/rmd-site/renv/settings.json b/test/e2e/content-workspace/rmd-site/renv/settings.json deleted file mode 100644 index d5590a960d..0000000000 --- a/test/e2e/content-workspace/rmd-site/renv/settings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "bioconductor.version": null, - "external.libraries": [], - "ignored.packages": [], - "package.dependency.fields": ["Imports", "Depends", "LinkingTo"], - "ppm.enabled": null, - "ppm.ignored.urls": [], - "r.version": null, - "snapshot.type": "implicit", - "use.cache": true, - "vcs.ignore.cellar": true, - "vcs.ignore.library": true, - "vcs.ignore.local": true, - "vcs.manage.ignores": true -} diff --git a/test/e2e/content-workspace/rmd-site/rmd-site.Rproj b/test/e2e/content-workspace/rmd-site/rmd-site.Rproj deleted file mode 100644 index 827cca17d1..0000000000 --- a/test/e2e/content-workspace/rmd-site/rmd-site.Rproj +++ /dev/null @@ -1,15 +0,0 @@ -Version: 1.0 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX - -BuildType: Website diff --git a/test/e2e/content-workspace/shinyapp/.Rprofile b/test/e2e/content-workspace/shinyapp/.Rprofile deleted file mode 100644 index 81b960f5c6..0000000000 --- a/test/e2e/content-workspace/shinyapp/.Rprofile +++ /dev/null @@ -1 +0,0 @@ -source("renv/activate.R") diff --git a/test/e2e/content-workspace/shinyapp/app.R b/test/e2e/content-workspace/shinyapp/app.R deleted file mode 100644 index 284848e45b..0000000000 --- a/test/e2e/content-workspace/shinyapp/app.R +++ /dev/null @@ -1,49 +0,0 @@ -# -# This is a Shiny web application. You can run the application by clicking -# the 'Run App' button above. -# -# Find out more about building applications with Shiny here: -# -# http://shiny.rstudio.com/ -# - -library(shiny) - -# Define UI for application that draws a histogram -ui <- fluidPage( - - # Application title - titlePanel("Old Faithful Geyser Data"), - - # Sidebar with a slider input for number of bins - sidebarLayout( - sidebarPanel( - sliderInput("bins", - "Number of bins:", - min = 1, - max = 50, - value = 30) - ), - - # Show a plot of the generated distribution - mainPanel( - plotOutput("distPlot") - ) - ) -) - -# Define server logic required to draw a histogram -server <- function(input, output) { - - output$distPlot <- renderPlot({ - # generate bins based on input$bins from ui.R - x <- faithful[, 2] - bins <- seq(min(x), max(x), length.out = input$bins + 1) - - # draw the histogram with the specified number of bins - hist(x, breaks = bins, col = 'darkgray', border = 'white') - }) -} - -# Run the application -shinyApp(ui = ui, server = server) diff --git a/test/e2e/content-workspace/shinyapp/index.htm b/test/e2e/content-workspace/shinyapp/index.htm deleted file mode 100644 index f5fa342a4d..0000000000 --- a/test/e2e/content-workspace/shinyapp/index.htm +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - -

testapp

-
- - diff --git a/test/e2e/content-workspace/shinyapp/renv.lock b/test/e2e/content-workspace/shinyapp/renv.lock deleted file mode 100644 index 091997fcb9..0000000000 --- a/test/e2e/content-workspace/shinyapp/renv.lock +++ /dev/null @@ -1,568 +0,0 @@ -{ - "R": { - "Version": "4.3.3", - "Repositories": [ - { - "Name": "CRAN", - "URL": "https://cloud.r-project.org" - } - ] - }, - "Packages": { - "R6": { - "Package": "R6", - "Version": "2.5.1", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "R6", - "RemoteRef": "R6", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "2.5.1", - "Requirements": [ - "R" - ], - "Hash": "470851b6d5d0ac559e9d01bb352b4021" - }, - "Rcpp": { - "Package": "Rcpp", - "Version": "1.0.14", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "methods", - "utils" - ], - "Hash": "e7bdd9ee90e96921ca8a0f1972d66682" - }, - "base64enc": { - "Package": "base64enc", - "Version": "0.1-3", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "base64enc", - "RemoteRef": "base64enc", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "0.1-3", - "Requirements": [ - "R" - ], - "Hash": "543776ae6848fde2f48ff3816d0628bc" - }, - "bslib": { - "Package": "bslib", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "base64enc", - "cachem", - "fastmap", - "grDevices", - "htmltools", - "jquerylib", - "jsonlite", - "lifecycle", - "memoise", - "mime", - "rlang", - "sass" - ], - "Hash": "70a6489cc254171fb9b4a7f130f44dca" - }, - "cachem": { - "Package": "cachem", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "cachem", - "RemoteRef": "cachem", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.1.0", - "Requirements": [ - "fastmap", - "rlang" - ], - "Hash": "cd9a672193789068eb5a2aad65a0dedf" - }, - "cli": { - "Package": "cli", - "Version": "3.6.3", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "cli", - "RemoteRef": "cli", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "3.6.3", - "Requirements": [ - "R", - "utils" - ], - "Hash": "b21916dd77a27642b447374a5d30ecf3" - }, - "commonmark": { - "Package": "commonmark", - "Version": "1.9.2", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "commonmark", - "RemoteRef": "commonmark", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.9.2", - "Hash": "14eb0596f987c71535d07c3aff814742" - }, - "crayon": { - "Package": "crayon", - "Version": "1.5.3", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "crayon", - "RemoteRef": "crayon", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.5.3", - "Requirements": [ - "grDevices", - "methods", - "utils" - ], - "Hash": "859d96e65ef198fd43e82b9628d593ef" - }, - "digest": { - "Package": "digest", - "Version": "0.6.37", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "digest", - "RemoteRef": "digest", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "0.6.37", - "Requirements": [ - "R", - "utils" - ], - "Hash": "33698c4b3127fc9f506654607fb73676" - }, - "fastmap": { - "Package": "fastmap", - "Version": "1.2.0", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "fastmap", - "RemoteRef": "fastmap", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.2.0", - "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8" - }, - "fontawesome": { - "Package": "fontawesome", - "Version": "0.5.3", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "fontawesome", - "RemoteRef": "fontawesome", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "0.5.3", - "Requirements": [ - "R", - "htmltools", - "rlang" - ], - "Hash": "bd1297f9b5b1fc1372d19e2c4cd82215" - }, - "fs": { - "Package": "fs", - "Version": "1.6.5", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "fs", - "RemoteRef": "fs", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.6.5", - "Requirements": [ - "R", - "methods" - ], - "Hash": "7f48af39fa27711ea5fbd183b399920d" - }, - "glue": { - "Package": "glue", - "Version": "1.8.0", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "glue", - "RemoteRef": "glue", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.8.0", - "Requirements": [ - "R", - "methods" - ], - "Hash": "5899f1eaa825580172bb56c08266f37c" - }, - "htmltools": { - "Package": "htmltools", - "Version": "0.5.8.1", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "htmltools", - "RemoteRef": "htmltools", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "0.5.8.1", - "Requirements": [ - "R", - "base64enc", - "digest", - "fastmap", - "grDevices", - "rlang", - "utils" - ], - "Hash": "81d371a9cc60640e74e4ab6ac46dcedc" - }, - "httpuv": { - "Package": "httpuv", - "Version": "1.6.15", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "httpuv", - "RemoteRef": "httpuv", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.6.15", - "Requirements": [ - "R", - "R6", - "Rcpp", - "later", - "promises", - "utils" - ], - "Hash": "d55aa087c47a63ead0f6fc10f8fa1ee0" - }, - "jquerylib": { - "Package": "jquerylib", - "Version": "0.1.4", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "jquerylib", - "RemoteRef": "jquerylib", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "0.1.4", - "Requirements": [ - "htmltools" - ], - "Hash": "5aab57a3bd297eee1c1d862735972182" - }, - "jsonlite": { - "Package": "jsonlite", - "Version": "1.8.9", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "jsonlite", - "RemoteRef": "jsonlite", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.8.9", - "Requirements": [ - "methods" - ], - "Hash": "4e993b65c2c3ffbffce7bb3e2c6f832b" - }, - "later": { - "Package": "later", - "Version": "1.4.1", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "later", - "RemoteRef": "later", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.4.1", - "Requirements": [ - "Rcpp", - "rlang" - ], - "Hash": "501744395cac0bab0fbcfab9375ae92c" - }, - "lifecycle": { - "Package": "lifecycle", - "Version": "1.0.4", - "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ - "R", - "cli", - "glue", - "rlang" - ], - "Hash": "b8552d117e1b808b09a832f589b79035" - }, - "magrittr": { - "Package": "magrittr", - "Version": "2.0.3", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "magrittr", - "RemoteRef": "magrittr", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "2.0.3", - "Requirements": [ - "R" - ], - "Hash": "7ce2733a9826b3aeb1775d56fd305472" - }, - "memoise": { - "Package": "memoise", - "Version": "2.0.1", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "memoise", - "RemoteRef": "memoise", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "2.0.1", - "Requirements": [ - "cachem", - "rlang" - ], - "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" - }, - "mime": { - "Package": "mime", - "Version": "0.12", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "mime", - "RemoteRef": "mime", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "0.12", - "Requirements": [ - "tools" - ], - "Hash": "18e9c28c1d3ca1560ce30658b22ce104" - }, - "promises": { - "Package": "promises", - "Version": "1.3.2", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "promises", - "RemoteRef": "promises", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.3.2", - "Requirements": [ - "R6", - "Rcpp", - "fastmap", - "later", - "magrittr", - "rlang", - "stats" - ], - "Hash": "c84fd4f75ea1f5434735e08b7f50fbca" - }, - "rappdirs": { - "Package": "rappdirs", - "Version": "0.3.3", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "rappdirs", - "RemoteRef": "rappdirs", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "0.3.3", - "Requirements": [ - "R" - ], - "Hash": "5e3c5dc0b071b21fa128676560dbe94d" - }, - "renv": { - "Package": "renv", - "Version": "0.17.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "utils" - ], - "Hash": "4543b8cd233ae25c6aba8548be9e747e" - }, - "rlang": { - "Package": "rlang", - "Version": "1.1.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "724dcc1490cd7071ee75ca2994a5446e" - }, - "sass": { - "Package": "sass", - "Version": "0.4.9", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "sass", - "RemoteRef": "sass", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "0.4.9", - "Requirements": [ - "R6", - "fs", - "htmltools", - "rappdirs", - "rlang" - ], - "Hash": "d53dbfddf695303ea4ad66f86e99b95d" - }, - "shiny": { - "Package": "shiny", - "Version": "1.10.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "bslib", - "cachem", - "commonmark", - "crayon", - "fastmap", - "fontawesome", - "glue", - "grDevices", - "htmltools", - "httpuv", - "jsonlite", - "later", - "lifecycle", - "methods", - "mime", - "promises", - "rlang", - "sourcetools", - "tools", - "utils", - "withr", - "xtable" - ], - "Hash": "4b4477baa9a939c5577e5ddb4bf01f28" - }, - "sourcetools": { - "Package": "sourcetools", - "Version": "0.1.7-1", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "sourcetools", - "RemoteRef": "sourcetools", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "0.1.7-1", - "Requirements": [ - "R" - ], - "Hash": "5f5a7629f956619d519205ec475fe647" - }, - "withr": { - "Package": "withr", - "Version": "3.0.2", - "Source": "Repository", - "Repository": "CRAN", - "RemoteType": "standard", - "RemotePkgRef": "withr", - "RemoteRef": "withr", - "RemoteRepos": "https://cloud.r-project.org", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "3.0.2", - "Requirements": [ - "R", - "grDevices", - "graphics" - ], - "Hash": "cc2d62c76458d425210d1eb1478b30b4" - }, - "xtable": { - "Package": "xtable", - "Version": "1.8-4", - "Source": "Repository", - "Repository": "RSPM", - "RemoteType": "standard", - "RemotePkgRef": "xtable", - "RemoteRef": "xtable", - "RemoteRepos": "https://packagemanager.posit.co/cran/latest", - "RemoteReposName": "CRAN", - "RemotePkgPlatform": "x86_64-apple-darwin20", - "RemoteSha": "1.8-4", - "Requirements": [ - "R", - "stats", - "utils" - ], - "Hash": "b8acdf8af494d9ec19ccb2481a9b11c2" - } - } -} diff --git a/test/e2e/content-workspace/simple.py b/test/e2e/content-workspace/simple.py deleted file mode 100644 index dc8d62f200..0000000000 --- a/test/e2e/content-workspace/simple.py +++ /dev/null @@ -1,18 +0,0 @@ - -from typing import List - -from fastapi import FastAPI - -app = FastAPI() - - -@app.post("/capitalize") -def capitalize(text: List[str]) -> List[str]: - capitalized = [t.upper() for t in text] - return capitalized - - -@app.post("/paste") -def paste(first: List[str], second: List[str]) -> List[str]: - result = [a + " " + b for a, b in zip(first, second)] - return result diff --git a/test/e2e/support/commands.js b/test/e2e/support/commands.js index 11b77fb769..5a524180e9 100644 --- a/test/e2e/support/commands.js +++ b/test/e2e/support/commands.js @@ -165,25 +165,22 @@ EOF`, // clearupDeployments // Purpose: Remove .posit metadata to reset deployments per test or per subdir, with exclusions. -Cypress.Commands.add( - "clearupDeployments", - (subdir, excludeDirs = ["config-errors"]) => { - // If subdir is provided, only target that directory - if (subdir) { - // If subdir is in the exclude list, skip deletion - if (excludeDirs.includes(subdir)) return; - const target = `content-workspace/${subdir}/.posit`; - cy.exec(`rm -rf ${target}`, { failOnNonZeroExit: false }); - } else { - // Build a list of all .posit directories except excluded ones - const excludePatterns = excludeDirs - .map((dir) => `-not -path "*/${dir}/*"`) - .join(" "); - const findCmd = `find content-workspace -type d -name ".posit" ${excludePatterns}`; - cy.exec(`${findCmd} -exec rm -rf {} +`, { failOnNonZeroExit: false }); - } - }, -); +Cypress.Commands.add("clearupDeployments", (subdir, excludeDirs = []) => { + // If subdir is provided, only target that directory + if (subdir) { + // If subdir is in the exclude list, skip deletion + if (excludeDirs.includes(subdir)) return; + const target = `content-workspace/${subdir}/.posit`; + cy.exec(`rm -rf ${target}`, { failOnNonZeroExit: false }); + } else { + // Build a list of all .posit directories except excluded ones + const excludePatterns = excludeDirs + .map((dir) => `-not -path "*/${dir}/*"`) + .join(" "); + const findCmd = `find content-workspace -type d -name ".posit" ${excludePatterns}`; + cy.exec(`${findCmd} -exec rm -rf {} +`, { failOnNonZeroExit: false }); + } +}); // returns // config: { diff --git a/test/e2e/support/oauth-task.js b/test/e2e/support/oauth-task.js index dc387ecedc..e33a4a5e9e 100644 --- a/test/e2e/support/oauth-task.js +++ b/test/e2e/support/oauth-task.js @@ -11,8 +11,6 @@ const { getSharedBrowserContext, cleanupSharedBrowser, } = require("./shared-browser"); -// Include publish confirmation task so config can register all tasks via one helper -const { confirmPCCPublishSuccess } = require("./publish-success-task"); /** * Automates the OAuth device code flow in a browser using Playwright. @@ -324,7 +322,6 @@ function buildCypressTasks(pccConfig) { await cleanupSharedBrowser(); return null; }, - confirmPCCPublishSuccess, // { publishedUrl, expectedTitle } => { success, error?, warning? } }; } diff --git a/test/e2e/support/publish-success-task.js b/test/e2e/support/publish-success-task.js deleted file mode 100644 index 1e1e3b7552..0000000000 --- a/test/e2e/support/publish-success-task.js +++ /dev/null @@ -1,113 +0,0 @@ -// Purpose: Confirm a PCC deployment is live by loading the published URL with Playwright. -// - Retries navigation, checks for 404 UI, then inspects .navbar-static-top h1 for expected title. -// - Returns { success, warning? } to the Cypress test for assertion/logging. -// Notes: Reuses a shared browser context to speed up repeated checks. -const { getPlaywrightTimeout } = require("./playwright-utils"); - -// Import shared browser context from shared-browser utility -const { getSharedBrowserContext } = require("./shared-browser"); - -async function confirmPCCPublishSuccess({ publishedUrl, expectedTitle }) { - let page; - try { - console.log(`🔍 Verifying published app at: ${publishedUrl}`); - - // Use shared browser context for better performance - const { context } = await getSharedBrowserContext(); - page = await context.newPage(); - - // Block Google analytics and tracking requests to improve speed and reliability - await page.route("**/*google-analytics.com*", (route) => route.abort()); - await page.route("**/*googletagmanager.com*", (route) => route.abort()); - await page.route("**/*android.clients.google.com*", (route) => - route.abort(), - ); - - const maxAttempts = 10; // 10 attempts * 5s = 50 seconds max - const delay = 5000; - let lastError = null; - - for (let attempt = 1; attempt <= maxAttempts; attempt++) { - try { - console.log( - `[Playwright] Attempt ${attempt}: Navigating to ${publishedUrl}`, - ); - const response = await page.goto(publishedUrl, { - waitUntil: "domcontentloaded", - timeout: getPlaywrightTimeout(), - }); - console.log( - `[Playwright] Attempt ${attempt}: Navigation complete, status: ${response && response.status()}`, - ); - if (response && response.status() === 200) { - // Check for 404 UI (only if element exists) - const notFoundLocator = page.locator(".error_message h1").first(); - let notFoundText = null; - if ((await notFoundLocator.count()) > 0) { - notFoundText = await notFoundLocator.textContent(); - } - if (notFoundText && notFoundText.trim() === "Page Not Found") { - lastError = "Page Not Found error UI detected"; - console.log(`[Playwright] Attempt ${attempt}: 404 UI detected`); - } else { - // Wait for the Shiny app's navbar-brand h1 to appear (up to 10s) - let h1Text = null; - try { - await page.waitForSelector(".navbar-static-top h1", { - timeout: getPlaywrightTimeout(), - }); - const h1 = await page.locator(".navbar-static-top h1").first(); - h1Text = await h1.textContent(); - } catch { - console.log( - `[Playwright] Attempt ${attempt}: .navbar-static-top h1 not found after wait`, - ); - } - const content = await page.content(); - console.log( - `[Playwright] Attempt ${attempt}: .navbar-static-top h1='${h1Text}', first 500 page content:`, - content.substring(0, 500), - ); - if (h1Text && h1Text.trim() === expectedTitle) { - return { success: true }; - } else if (content.includes(expectedTitle)) { - return { - success: true, - warning: `Title '${expectedTitle}' found in page content but not in .navbar-static-top h1`, - }; - } else { - lastError = `Expected title '${expectedTitle}' not found in .navbar-static-top h1 (found: '${h1Text}')`; - } - } - } else if (response && response.status() === 404) { - // Don't immediately fail on 404 - the content may not have propagated yet - lastError = `HTTP 404: Page not found at ${publishedUrl}`; - console.log( - `[Playwright] Attempt ${attempt}: Got 404, content may not have propagated yet`, - ); - } else { - lastError = `Status: ${response && response.status()}`; - } - } catch (err) { - console.error(`[Playwright] Attempt ${attempt}: Error:`, err); - lastError = err.message; - } - await new Promise((res) => setTimeout(res, delay)); - } - return { - success: false, - error: lastError || "Publish confirmation failed", - }; - } catch (err) { - console.error("Playwright task error:", err); - return { success: false, error: err.message || String(err) }; - } finally { - try { - if (page) await page.close(); - } catch (cleanupErr) { - console.log("[Playwright] Cleanup error:", cleanupErr.message); - } - } -} - -module.exports = { confirmPCCPublishSuccess }; diff --git a/test/e2e/tests/deployments.cy.js b/test/e2e/tests/deployments.cy.js index c457da4e62..e4546b9434 100644 --- a/test/e2e/tests/deployments.cy.js +++ b/test/e2e/tests/deployments.cy.js @@ -2,8 +2,8 @@ // Purpose: Positive-path deployment creation for PCS and PCC. // - PCS Static: creates a static content deployment and validates TOML contents. -// - PCC Shiny Python: creates a PCC deployment, selects additional files, -// modifies TOML for public access, deploys, and confirms published app via Playwright. +// - PCC Static: creates a PCC deployment with static HTML, modifies TOML for +// public access, deploys, and confirms the deployment record has a direct_url. describe("Deployments Section", () => { // Global setup for all deployment tests before(() => { @@ -51,37 +51,10 @@ describe("Deployments Section", () => { '[data-automation="publisher-deployment-section"]', ).should("exist"); }); - - // Unable to run this, - // as we will need to install the renv package - install.packages("renv") - // as well as call renv::restore(), before we can deploy. This will use - // the current version of R within our code-server image, so we'll have an - // extra bit of work when we want to change that version around to different - // ones. - it.skip("PCS ShinyApp Content Deployment", () => { - cy.createPCSDeployment("shinyapp", "app.R", "ShinyApp", (tomlFiles) => { - const config = tomlFiles.config.contents; - expect(config.title).to.equal("ShinyApp"); - expect(config.type).to.equal("r-shiny"); - expect(config.entrypoint).to.equal("app.R"); - expect(config.files[0]).to.equal("/app.R"); - expect(config.files[1]).to.equal("/renv.lock"); - expect(config.files[2]).to.equal( - `/.posit/publish/${tomlFiles.config.name}`, - ); - expect(config.files[3]).to.equal( - `/.posit/publish/deployments/${tomlFiles.contentRecord.name}`, - ); - }).deployCurrentlySelected(); - - cy.findUniqueInPublisherWebview( - '[data-automation="publisher-deployment-section"]', - ).should("exist"); - }); }); describe("Connect Cloud Deployments", () => { - it("PCC Shiny Python Deployment @pcc", () => { + it("PCC Static Content Deployment @pcc", () => { // Setup - moved from beforeEach to avoid running when @pcc tests are filtered cy.resetCredentials(); cy.clearupDeployments(); @@ -100,35 +73,25 @@ describe("Deployments Section", () => { // Ensure Publisher is in the expected initial state cy.expectInitialPublisherState(); - // Select files to include in deployment - const filesToSelect = ["data", "README.md", "styles.css"]; cy.createPCCDeployment( - "examples-shiny-python", - "app.py", - "shiny-python-pcc", + "static", + "index.html", + "static-pcc", (tomlFiles) => { const config = tomlFiles.config.contents; - expect(config.title).to.equal("shiny-python-pcc"); - expect(config.type).to.equal("python-shiny"); - expect(config.entrypoint).to.equal("app.py"); - // Check that all selected files are included (note: requirements.txt is auto-managed) - ["/app.py", "/data", "/README.md", "/styles.css"].forEach((file) => { - expect(config.files).to.include(file); - }); + expect(config.title).to.equal("static-pcc"); + expect(config.type).to.equal("html"); + expect(config.entrypoint).to.equal("index.html"); }, - filesToSelect, ); // Set public access via helper and then deploy - cy.getPublisherTomlFilePaths("examples-shiny-python").then( - ({ config }) => { - // Write both Python version and public access in one operation - return cy.writeTomlFile( - config.path, - "version = '3.11'\n[connect_cloud]\n[connect_cloud.access_control]\npublic_access = true", - ); - }, - ); + cy.getPublisherTomlFilePaths("static").then(({ config }) => { + return cy.writeTomlFile( + config.path, + "[connect_cloud]\n[connect_cloud.access_control]\npublic_access = true", + ); + }); cy.deployCurrentlySelected(); @@ -136,27 +99,12 @@ describe("Deployments Section", () => { '[data-automation="publisher-deployment-section"]', ).should("exist"); - // Load the deployment TOML to get the published URL and verify app - cy.getPublisherTomlFilePaths("examples-shiny-python").then( - (filePaths) => { - cy.loadTomlFile(filePaths.contentRecord.path).then( - (contentRecord) => { - const publishedUrl = contentRecord.direct_url; - - const expectedTitle = "Restaurant tipping"; - cy.task("confirmPCCPublishSuccess", { - publishedUrl, - expectedTitle, - }).then((result) => { - expect( - result.success, - result.error || "Publish confirmation failed", - ).to.be.true; - }); - }, - ); - }, - ); + // Verify the deployment record has a direct_url + cy.getPublisherTomlFilePaths("static").then((filePaths) => { + cy.loadTomlFile(filePaths.contentRecord.path).then((contentRecord) => { + expect(contentRecord.direct_url).to.be.a("string").and.not.be.empty; + }); + }); }); }); }); diff --git a/test/e2e/tests/embedded-deployments.cy.js b/test/e2e/tests/embedded-deployments.cy.js deleted file mode 100644 index b0bbc84297..0000000000 --- a/test/e2e/tests/embedded-deployments.cy.js +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (C) 2025 by Posit Software, PBC. - -// Purpose: Exercise embedded PCS deployments (FastAPI) from workspace root and subdirectory. -// - Validates TOML fields (title, type, entrypoint) and required files (order-agnostic). -// - Demonstrates writing additional TOML content (Python version) pre-deploy. -describe("Embedded Deployments Section", () => { - // Global setup - run once for entire test suite - before(() => { - cy.initializeConnect(); - }); - - beforeEach(() => { - cy.clearupDeployments(); - cy.visit("/"); - cy.getPublisherSidebarIcon().click(); - cy.waitForPublisherIframe(); - cy.debugIframes(); - }); - - describe("Create PCS Deployments", () => { - afterEach(() => { - cy.clearupDeployments(); - }); - - it("PCS fastapi at top of workspace", () => { - // We use `requires-python` to support multiple versions, - // which was added in 2025.03. We can test this before, but - // we need to match the version of python exactly then with - // what's in the image. - cy.skipIfConnectVersionBefore("2025.03"); - - // Ensure Publisher is in the expected initial state - cy.expectInitialPublisherState(); - - cy.createPCSDeployment( - ".", - "simple.py", - "fastapi-base-directory", - (tomlFiles) => { - const { contents: config } = tomlFiles.config; - const { name: cfgName } = tomlFiles.config; - const { name: recName } = tomlFiles.contentRecord; - - expect(config.title).to.equal("fastapi-base-directory"); - expect(config.type).to.equal("python-fastapi"); - expect(config.entrypoint).to.equal("simple.py"); - - // Assert required files without relying on order - expect(config.files).to.include.members([ - "/simple.py", - "/requirements.txt", - `/.posit/publish/${cfgName}`, - `/.posit/publish/deployments/${recName}`, - ]); - return tomlFiles; - }, - ).deployCurrentlySelected(); - - cy.findUniqueInPublisherWebview( - '[data-automation="publisher-deployment-section"]', - ).should("exist"); - }); - - it("PCS fastAPI in subdirectory of workspace", () => { - // We use `requires-python` to support multiple versions, - // which was added in 2025.03. We can test this before, but - // we need to match the version of python exactly then with - // what's in the image. - cy.skipIfConnectVersionBefore("2025.03"); - - // Ensure Publisher is in the expected initial state - cy.expectInitialPublisherState(); - - cy.createPCSDeployment( - "fastapi-simple", - "fastapi-main.py", - "fastapi-sub-directory", - (tomlFiles) => { - const { contents: config } = tomlFiles.config; - const { name: cfgName } = tomlFiles.config; - const { name: recName } = tomlFiles.contentRecord; - - expect(config.title).to.equal("fastapi-sub-directory"); - expect(config.type).to.equal("python-fastapi"); - expect(config.entrypoint).to.equal("fastapi-main.py"); - - // Order-agnostic required files - expect(config.files).to.include.members([ - "/fastapi-main.py", - "/requirements.txt", - `/.posit/publish/${cfgName}`, - `/.posit/publish/deployments/${recName}`, - ]); - return tomlFiles; - }, - ).deployCurrentlySelected(); - - cy.findUniqueInPublisherWebview( - '[data-automation="publisher-deployment-section"]', - ).should("exist"); - }); - }); -}); diff --git a/test/e2e/tests/error-err-config.cy.js b/test/e2e/tests/error-err-config.cy.js deleted file mode 100644 index 34d2607ab3..0000000000 --- a/test/e2e/tests/error-err-config.cy.js +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (C) 2025 by Posit Software, PBC. - -// Purpose: Validate error rendering for pre-baked misconfigured deployments. -// - "Config is invalid": shows a specific validation error message. -// - "Config is missing": shows a specific "not found" message. - -// NOTE:: The error cases are created here by using pre-created files. -// Because of this, they are not suitable for deployment (due to their hard-coded values) - -// Uses text-scoped queries with retry to avoid brittle DOM chains. -describe("Detect errors in config", () => { - // Global setup - run once for entire test suite - before(() => { - cy.clearupDeployments(); - cy.setAdminCredentials(); - }); - - beforeEach(() => { - // Light navigation only - cy.visit("/"); - cy.getPublisherSidebarIcon().click(); - cy.waitForPublisherIframe(); - cy.debugIframes(); - }); - - it("Show errors when Config is invalid", () => { - // Selects error deployment and asserts the quick-pick label appears, - // then verifies the detailed error paragraph is present. - - // Ensure Publisher is in the expected initial state - cy.expectInitialPublisherState(); - - // click on the select deployment button - cy.publisherWebview() - .findByTestId("select-deployment") - .then((dplyPicker) => { - Cypress.$(dplyPicker).trigger("click"); - }); - - cy.get(".quick-input-widget").should("be.visible"); - cy.get(".quick-input-titlebar").should("have.text", "Select Deployment"); - - // Wait for deployment list to populate before searching for specific item - cy.get(".quick-input-widget .quick-input-list-row").should("exist"); - - // select our error case - cy.get(".quick-input-widget") - .contains("Unknown Title • Error in quarto-project-8G2B") - .click(); - - // confirm that the selector shows the error - cy.findUniqueInPublisherWebview( - '[data-automation="publisher-deployment-section"] .quick-pick-label:contains("Unknown Title • Error in quarto-project-8G2B")', - ).should("be.visible"); - - // confirm that we also have an error section - cy.findUniqueInPublisherWebview( - '[data-automation="publisher-deployment-section"] p:contains("The selected Configuration has an error: invalidParam: not allowed.")', - ).should("exist"); - }); - - it("Show errors when Config is missing", () => { - // Selects missing-config deployment and asserts the quick-pick label appears, - // then verifies the detailed "not found" error paragraph is present. - - // Ensure Publisher is in the expected initial state - cy.expectInitialPublisherState(); - - // click on the select deployment button - cy.publisherWebview() - .findByTestId("select-deployment") - .then((dplyPicker) => { - Cypress.$(dplyPicker).trigger("click"); - }); - - cy.get(".quick-input-widget").should("be.visible"); - cy.get(".quick-input-titlebar").should("have.text", "Select Deployment"); - - // Wait for deployment list to populate before searching for specific item - cy.get(".quick-input-widget .quick-input-list-row").should("exist"); - - // select our error case - cy.get(".quick-input-widget") - .contains("Unknown Title Due to Missing Config fastapi-simple-DHJL") - .click(); - - // confirm that the selector shows the error - cy.findUniqueInPublisherWebview( - '[data-automation="publisher-deployment-section"] .quick-pick-label:contains("Unknown Title Due to Missing Config fastapi-simple-DHJL")', - ).should("be.visible"); - - // confirm that we also have an error section - cy.findUniqueInPublisherWebview( - '[data-automation="publisher-deployment-section"] p:contains("The last Configuration used for this Deployment was not found.")', - ).should("exist"); - }); -}); diff --git a/test/e2e/tests/multi-stepper-negative.cy.js b/test/e2e/tests/multi-stepper-negative.cy.js index 9c3fbeeb83..1c4f937d25 100644 --- a/test/e2e/tests/multi-stepper-negative.cy.js +++ b/test/e2e/tests/multi-stepper-negative.cy.js @@ -135,7 +135,7 @@ describe("Multi-Stepper Negative Cases", () => { // - Cancels via ESC key // - Verifies return to initial publisher state with no artifacts - cy.startDeploymentCreationFlow("simple.py"); + cy.startDeploymentCreationFlow("index.html"); // Start typing title but then cancel cy.get(".quick-input-widget") diff --git a/test/e2e/tests/open-connect-content.cy.js b/test/e2e/tests/open-connect-content.cy.js deleted file mode 100644 index e834911a01..0000000000 --- a/test/e2e/tests/open-connect-content.cy.js +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (C) 2026 by Posit Software, PBC. - -describe("Open Connect Content", () => { - before(() => { - cy.initializeConnect(); - }); - - afterEach(() => { - cy.clearupDeployments(); - }); - - it("opens deployed content in the explorer tree", () => { - cy.on("uncaught:exception", () => false); - cy.clearupDeployments("static"); - cy.visit("/?folder=/home/coder/workspace"); - cy.getPublisherSidebarIcon().click(); - cy.waitForPublisherIframe(); - cy.debugIframes(); - cy.expectInitialPublisherState(); - - cy.createPCSDeployment("static", "index.html", "static", () => { - return; - }).deployCurrentlySelected(); - - cy.getPublisherTomlFilePaths("static").then((filePaths) => { - cy.loadTomlFile(filePaths.contentRecord.path).then((contentRecord) => { - // Capture the current URL before running the command - cy.url().then((originalUrl) => { - cy.runCommandPaletteCommand("Posit Publisher: Open Connect Content"); - cy.quickInputType("Connect server URL", contentRecord.server_url); - cy.quickInputType("Connect content GUID", contentRecord.id); - - // Wait for the quick input to close, indicating the command has been submitted - cy.get(".quick-input-widget").should("not.be.visible"); - - // Wait for the workspace to actually start reloading by detecting URL change. - // This prevents the race condition where retries run against the old workspace - // before VS Code has started loading the new one. - cy.url({ timeout: 30000 }).should("not.eq", originalUrl); - - // Wait for VS Code to fully reload after the workspace switch. - // The workbench needs time to initialize with the new workspace. - cy.get(".monaco-workbench", { timeout: 60000 }).should("be.visible"); - - // Additional wait for the explorer to be ready - cy.get(".explorer-viewlet", { timeout: 30000 }).should("exist"); - - // Wait for the workspace to reload with the Connect content. - // The GUID appears in the explorer as a root folder after the workspace switch. - // Use { timeout: 0 } in the inner cy.contains() so retryWithBackoff controls - // the retry timing rather than cy.contains() blocking on its own timeout. - cy.retryWithBackoff( - () => - cy.get("body", { timeout: 0 }).then(($body) => { - const explorer = $body.find(".explorer-viewlet"); - if (explorer.length === 0) { - return Cypress.$(); // Explorer not yet rendered, return empty to retry - } - const row = explorer.find( - `.monaco-list-row[aria-level='1']:contains("${contentRecord.id}")`, - ); - return row.length > 0 ? cy.wrap(row) : Cypress.$(); - }), - 20, - 1500, - ).should("exist"); - }); - }); - }); - - cy.retryWithBackoff( - () => - cy.get("body", { timeout: 0 }).then(($body) => { - if ($body.find(".explorer-viewlet:visible").length === 0) { - const explorerButton = - $body - .find( - '[id="workbench.parts.activitybar"] .action-item[role="button"][aria-label="Explorer"]', - ) - .get(0) || $body.find("a.codicon-explorer-view-icon").get(0); - if (explorerButton) { - explorerButton.click(); - } - return Cypress.$(); // Return empty to retry after clicking - } - const explorer = $body.find(".explorer-viewlet:visible"); - return explorer.length > 0 ? cy.wrap(explorer) : Cypress.$(); - }), - 12, - 1000, - ).should("be.visible"); - - cy.retryWithBackoff( - () => - cy.get("body", { timeout: 0 }).then(($body) => { - const items = $body.find(".explorer-viewlet .explorer-item"); - return items.length > 0 ? cy.wrap(items) : Cypress.$(); - }), - 10, - 1000, - ).should("exist"); - - cy.get(".explorer-viewlet") - .find('.monaco-list-row[aria-level="1"]') - .first() - .then(($row) => { - if ($row.attr("aria-expanded") === "false") { - cy.wrap($row).click(); - } - }); - - cy.retryWithBackoff( - () => - cy.get("body", { timeout: 0 }).then(($body) => { - const match = $body.find( - '.explorer-viewlet .explorer-item a > span:contains("manifest.json")', - ); - return match.length > 0 ? cy.wrap(match) : Cypress.$(); - }), - 10, - 1000, - ).should("be.visible"); - - cy.retryWithBackoff( - () => - cy.get("body", { timeout: 0 }).then(($body) => { - const match = $body.find( - '.explorer-viewlet .explorer-item a > span:contains("index.html")', - ); - return match.length > 0 ? cy.wrap(match) : Cypress.$(); - }), - 10, - 1000, - ).should("be.visible"); - }); -}); diff --git a/test/e2e/tests/workbench/positron/deployments.cy.js b/test/e2e/tests/workbench/positron/deployments.cy.js index 7c3bda95f5..46c29a59ed 100644 --- a/test/e2e/tests/workbench/positron/deployments.cy.js +++ b/test/e2e/tests/workbench/positron/deployments.cy.js @@ -38,37 +38,5 @@ describe("Workbench > Positron", { baseUrl: WORKBENCH_BASE_URL }, () => { "Connect", ).deployCurrentlySelected(); }); - - // TODO this passes but has errors in the console: - // Error in file(filename, "r", encoding = encoding) : - // cannot open the connection - // In addition: Warning message: - // In file(filename, "r", encoding = encoding) : - // cannot open file 'renv/activate.R': No such file or directory - // Error while sourcing R profile file at path '/content-workspace/shinyapp/.Rprofile': - // Unexpected longjump - // Likely caused by: - // Error in file(filename, "r", encoding = encoding) : - // cannot open the connection - it.skip("ShinyApp Content Deployment", () => { - cy.createPWBDeployment("shinyapp", "app.R", "ShinyApp", (tomlFiles) => { - const config = tomlFiles.config.contents; - expect(config.title).to.equal("ShinyApp"); - expect(config.type).to.equal("r-shiny"); - expect(config.entrypoint).to.equal("app.R"); - expect(config.files[0]).to.equal("/app.R"); - expect(config.files[1]).to.equal("/renv.lock"); - expect(config.files[2]).to.equal( - `/.posit/publish/${tomlFiles.config.name}`, - ); - expect(config.files[3]).to.equal( - `/.posit/publish/deployments/${tomlFiles.contentRecord.name}`, - ); - }).deployCurrentlySelected(); - - cy.findUniqueInPublisherWebview( - '[data-automation="publisher-deployment-section"]', - ).should("exist"); - }); }); });