diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index b15fff70..d2e9e4a2 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -175,53 +175,6 @@ jobs:
pytest tests/test_main_system_caches.py
pytest -m 'vetiver'
- test-jupyter:
- runs-on: ubuntu-latest
- env:
- CONNECT_LICENSE: ${{ secrets.RSC_LICENSE }}
- ADMIN_API_KEY: ${{ secrets.ADMIN_API_KEY }}
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- - uses: extractions/setup-just@v2
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- - name: Build Containers
- run: |
- cd integration-testing
- docker compose build client
- docker compose build cypress
- - name: Start Connect + rsconnect-jupyter
- run: |
- just integration-testing/up
-
- - name: Run Cypress Tests
- run: |
- just integration-testing/up-cypress
-
- # Videos are captured whether the suite fails or passes
- - name: Save videos
- uses: actions/upload-artifact@v4
- if: success() || failure()
- with:
- name: cypress-videos
- path: integration-testing/cypress/videos
- if-no-files-found: ignore
- retention-days: 1
-
- # Screenshots are only captured on failure
- - name: Save screenshots
- uses: actions/upload-artifact@v4
- if: failure()
- with:
- name: cypress-screenshots
- path: integration-testing/cypress/screenshots
- if-no-files-found: ignore
- retention-days: 1
-
test-connect:
needs: distributions
runs-on: ubuntu-latest
diff --git a/README.md b/README.md
index 8596cf20..19dcdcc5 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,7 @@
# The rsconnect-python CLI
This package provides a CLI (command-line interface) for interacting
-with and deploying to Posit Connect. This is also used by the
-[`rsconnect-jupyter`](https://github.com/rstudio/rsconnect-jupyter) package to deploy
-Jupyter notebooks via the Jupyter web console. Many types of content supported by Posit
+with and deploying to Posit Connect. Many types of content supported by Posit
Connect may be deployed by this package, including WSGI-style APIs, Dash, Streamlit,
Gradio, and Bokeh applications.
@@ -649,7 +647,7 @@ Generated from rsconnect-python {{ rsconnect_python.version }}
### Hide Jupyter Notebook Input Code Cells
-The user can render a Jupyter notebook without its corresponding input code cells by passing the '--hide-all-input' flag through the cli:
+You can render a Jupyter notebook without its corresponding input code cells by passing the '--hide-all-input' flag through the cli:
```bash
rsconnect deploy notebook \
@@ -659,7 +657,8 @@ rsconnect deploy notebook \
my-notebook.ipynb
```
-To selectively hide input cells in a Jupyter notebook, the user needs to follow a two step process:
+To selectively hide input cells in a Jupyter notebook, you need to do two things:
+
1. tag cells with the 'hide_input' tag,
2. then pass the ' --hide-tagged-input' flag through the cli:
@@ -671,7 +670,8 @@ rsconnect deploy notebook \
my-notebook.ipynb
```
-By default, rsconnect-python does not install Jupyter notebook related depenencies. These dependencies are installed via rsconnect-jupyter. When the user is using the hide input features in rsconnect-python by itself without rsconnect-jupyter, he/she needs to install the following package depenecies:
+By default, rsconnect-python does not install Jupyter notebook-related depenencies.
+To use these hide input features in rsconnect-python you need to install these extra dependencies:
```
notebook
diff --git a/integration-testing/content/notebook/README.md b/integration-testing/content/notebook/README.md
deleted file mode 100644
index ad2e4b8d..00000000
--- a/integration-testing/content/notebook/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Stock Report
-
-## About this example
-
-This stock report is generated using Python and Jupyter Notebook. Stock prices are populated from Quandl to generate a stock performance summary intended to run daily after market close.
-
-
-## Learn more
-
-* [Jupyter Homepage](https://jupyter.org/)
-* [Jupyter Documentation](https://jupyter.org/documentation)
-* [Using Jupyter Notebooks in {systemDisplayName}](https://docs.posit.co/connect/user/jupyter-notebook/)
-* [User Guide for rsconnect_jupyter](https://docs.posit.co/rsconnect-jupyter/)
-
-## Requirements
-
-* Python version 3.7 or higher
-
-
diff --git a/integration-testing/content/notebook/quandl-wiki-tsla.json.gz b/integration-testing/content/notebook/quandl-wiki-tsla.json.gz
deleted file mode 100644
index 168a29c7..00000000
Binary files a/integration-testing/content/notebook/quandl-wiki-tsla.json.gz and /dev/null differ
diff --git a/integration-testing/content/notebook/requirements.txt b/integration-testing/content/notebook/requirements.txt
deleted file mode 100644
index 8b5b507a..00000000
--- a/integration-testing/content/notebook/requirements.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-jupyter
-matplotlib
-pandas
diff --git a/integration-testing/content/notebook/stock-report-jupyter.ipynb b/integration-testing/content/notebook/stock-report-jupyter.ipynb
deleted file mode 100644
index 94977bc5..00000000
--- a/integration-testing/content/notebook/stock-report-jupyter.ipynb
+++ /dev/null
@@ -1,464 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Stock Report: TSLA"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Summary\n",
- "\n",
- "\n",
- "
\n",
- " NOTE: This example requires quandl-wiki-tsla.json.gz to be included as an Additional File when publishing to Posit Connect as a notebook with source code.\n",
- "
\n",
- " NOTE: This report uses Quandl's WIKI price dataset for US publicly traded companies. As of April 11, 2018 this data feed is no longer actively supported by Quandl.\n",
- "
"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.9.16"
- },
- "rsconnect": {
- "previousServerId": "103c3a7d1bc73804ae13812f7e334afb",
- "servers": {
- "103c3a7d1bc73804ae13812f7e334afb": {
- "appId": 1,
- "appMode": "jupyter-static",
- "configUrl": "http://connect:3939/connect/#/apps/2e7db7ef-7b25-4e36-b5d6-806a3138654c",
- "disableTLSCheck": false,
- "notebookTitle": "stock-report-jupyter",
- "server": "http://connect:3939/",
- "serverName": "localhost"
- }
- },
- "version": 1
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/integration-testing/content/notebook/thumbnail.jpg b/integration-testing/content/notebook/thumbnail.jpg
deleted file mode 100644
index 4a64568a..00000000
Binary files a/integration-testing/content/notebook/thumbnail.jpg and /dev/null differ
diff --git a/integration-testing/content/voila/index.ipynb b/integration-testing/content/voila/index.ipynb
deleted file mode 100644
index ebb5d680..00000000
--- a/integration-testing/content/voila/index.ipynb
+++ /dev/null
@@ -1,119 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In this app we:\n",
- "* Plot the gaussian density for a specific $\\mu$ and $\\sigma$\n",
- "* Use the FloatSlider widget in ipywidgets to represent $\\mu$ and $\\sigma$ values\n",
- "* Stack the density plot along with the sliders into a nice layout using HBox and VBox layout objects available in ipywidgets\n",
- "* Link the sliders to the plot so that the plot gets updated when the values of $\\mu$ and $\\sigma$ change\n",
- "\n",
- "Find the code [here](https://github.com/pbugnion/voila-gallery/blob/master/gaussian-density/index.ipynb).\n",
- "\n",
- "This example is taken from [ChakriCherukuri/mlviz](https://github.com/ChakriCherukuri/mlviz)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "from scipy.stats import norm\n",
- "\n",
- "from ipywidgets import FloatSlider, HBox, VBox\n",
- "import bqplot.pyplot as plt"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "x = np.linspace(-10, 10, 200)\n",
- "y = norm.pdf(x)\n",
- "\n",
- "# plot the gaussian density\n",
- "title_tmpl = 'Gaussian Density (mu = {} and sigma = {})'\n",
- "pdf_fig = plt.figure(title=title_tmpl.format(0, 1))\n",
- "pdf_line = plt.plot(x, y, 'm', stroke_width=3)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# use two sliders to represent mu and sigma\n",
- "mu_slider = FloatSlider(description='mu', value=0, min=-5, max=5, step=.1)\n",
- "sigma_slider = FloatSlider(description='sigma', value=1, min=0.1, max=5, step=.1)\n",
- "\n",
- "slider_layout = HBox([mu_slider, sigma_slider])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def update_density(change):\n",
- " new_mu = mu_slider.value\n",
- " new_sigma = sigma_slider.value\n",
- " # update the y attribute of the plot with the new pdf\n",
- " # computed using new mu and sigma values\n",
- " pdf_line.y = norm.pdf(x, new_mu, new_sigma)\n",
- " \n",
- " # also update the fig title\n",
- " pdf_fig.title = title_tmpl.format(new_mu, new_sigma)\n",
- "\n",
- "# register the above callback with the 'value' trait of the sliders\n",
- "mu_slider.observe(update_density, 'value')\n",
- "sigma_slider.observe(update_density, 'value')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# now put all the widgets together into a simple dashboard\n",
- "# the plot should update now when the slider values are updated!\n",
- "final_layout = VBox([pdf_fig, slider_layout])\n",
- "final_layout"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.9.16"
- },
- "rsconnect": {
- "previousServerId": null,
- "servers": {},
- "version": 1
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/integration-testing/content/voila/requirements.txt b/integration-testing/content/voila/requirements.txt
deleted file mode 100644
index 2facda1c..00000000
--- a/integration-testing/content/voila/requirements.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-
-bqplot
-scipy
-voila
diff --git a/integration-testing/cypress.config.js b/integration-testing/cypress.config.js
deleted file mode 100644
index fa906be8..00000000
--- a/integration-testing/cypress.config.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// {
-// "testFiles": "**/*.spec.js",
-// "defaultCommandTimeout": 10000,
-// "responseTimeout": 60000,
-// "integrationFolder": "./cypress/integration/",
-// "viewportHeight": 800
-// }
-
-const { defineConfig } = require('cypress')
-
-module.exports = defineConfig({
- defaultCommandTimeout: 10000,
- responseTimeout: 60000,
- component: {
- viewportHeight: 800
- },
- e2e: {
- defaultCommandTimeout: 10000,
- specPattern: "cypress/e2e/**/*.cy.js",
- },
- "retries": 2
-})
diff --git a/integration-testing/cypress/e2e/jupyter.cy.js b/integration-testing/cypress/e2e/jupyter.cy.js
deleted file mode 100644
index 7b7a2853..00000000
--- a/integration-testing/cypress/e2e/jupyter.cy.js
+++ /dev/null
@@ -1,54 +0,0 @@
-describe('Publishing Jupyter Notebook', () => {
-
- it('Publish button loads', () => {
- cy.visit('http://client:9999/tree/integration-testing/content/notebook/stock-report-jupyter.ipynb');
- cy.get('button[data-jupyter-action="rsconnect_jupyter:publish"]').click();
- cy.get('a[id="publish-to-connect"]').should('be.visible')
- });
- // wait is required after every action, cypress is too fast for jupyter
- // https://github.com/cypress-io/cypress/issues/249
- // it('Add Server', () => {
-
- it('Add Server', () => {
- cy.visit('http://client:9999/tree/integration-testing/content/notebook/stock-report-jupyter.ipynb');
- cy.addServer();
- });
-
- // });
- it('Publish Jupyter Notebook', () => {
- cy.visit('http://client:9999/tree/integration-testing/content/notebook/stock-report-jupyter.ipynb');
- cy.wait(1000);
- cy.get('button[data-jupyter-action="rsconnect_jupyter:publish"]').click();
- cy.get('a[id="publish-to-connect"]').click();
- cy.wait(1000);
- cy.get('button[id="rsc-add-files"]').click();
- cy.wait(1000);
- cy.get('input[name="quandl-wiki-tsla.json.gz"]').click();
- cy.wait(1000);
- cy.get('button[id="add-files-dialog-accept"]').click();
- cy.wait(1000);
- cy.get('li[class="list-group-item"]').first().should('have.text'," quandl-wiki-tsla.json.gz");
- cy.wait(1000);
- cy.get('a[class="btn btn-primary"]').last().should('have.text',"Publish").click({ force: true });
- cy.wait(1000);
- cy.get('input[name="location"]').first().click();
- cy.wait(1000);
- cy.get('a[class="btn btn-primary"]').last().should('have.text',"Next").click();
- cy.wait(1000);
- cy.get('a[class="btn btn-primary"]').last().should('have.text',"Publish").click();
- cy.wait(1000);
- // allow for 5 minutes to deploy content
- cy.get('span[class="fa fa-link"]', { timeout: 300000 }).last().should('have.text'," Successfully published content").click();
- });
- it('Vist Content in Connect', () => {
- cy.connectLogin();
- cy.visit('http://connect:3939');
- cy.get('div[class="content-table__display-name"]').first().contains('stock-report-jupyter').click();
- cy.contentiFrame().contains('Stock Report: TSLA');
- });
-
- it('Remove Server', () => {
- cy.visit('http://client:9999/tree/integration-testing/content/notebook/stock-report-jupyter.ipynb');
- cy.removeServer();
- });
-});
diff --git a/integration-testing/cypress/e2e/voila.cy.js b/integration-testing/cypress/e2e/voila.cy.js
deleted file mode 100644
index e6082acb..00000000
--- a/integration-testing/cypress/e2e/voila.cy.js
+++ /dev/null
@@ -1,44 +0,0 @@
-describe('Publishing Voila Notebook', () => {
-
- it('Publish button loads', () => {
- cy.visit('http://client:9999/tree/integration-testing/content/voila/index.ipynb');
- cy.get('button[data-jupyter-action="rsconnect_jupyter:publish"]').click();
- cy.get('a[id="publish-to-connect"]').should('be.visible')
- });
-
- it('Add Server Voila', () => {
- cy.visit('http://client:9999/tree/integration-testing/content/voila/index.ipynb');
- cy.addServer();
- });
-
- it('Publish Content', () => {
- cy.visit('http://client:9999/tree/integration-testing/content/voila/index.ipynb');
- cy.wait(1000);
- cy.get('button[data-jupyter-action="rsconnect_jupyter:publish"]').click();
- cy.get('a[id="publish-to-connect"]').click({ force: true });
- cy.wait(1000);
- cy.get('a[id="rsc-publish-voila"]').click();
- cy.get('a[class="btn btn-primary"]').last().should('have.text',"Publish").click({ force: true });
- cy.wait(1000);
- cy.get('input[name="location"]').first().click();
- cy.wait(1000);
- cy.get('a[class="btn btn-primary"]').last().should('have.text',"Next").click();
- cy.wait(1000);
- cy.get('a[class="btn btn-primary"]').last().should('have.text',"Publish").click();
- cy.wait(1000);
- // allow for 5 minutes to deploy content
- cy.get('span[class="fa fa-link"]', { timeout: 300000 }).last().should('have.text'," Successfully published content").click();
- });
- it('Vist Content in Connect', () => {
- cy.connectLogin();
- cy.visit('http://connect:3939');
- cy.get('div[class="content-table__display-name"]').first().contains('index').click();
- cy.contentiFrame().contains('Plot the gaussian density');
- });
-
- it('Remove Server', () => {
- cy.visit('http://client:9999/tree/integration-testing/content/voila/index.ipynb');
- cy.removeServer();
- });
-
-});
\ No newline at end of file
diff --git a/integration-testing/cypress/plugins/index.js b/integration-testing/cypress/plugins/index.js
deleted file mode 100644
index fd170fba..00000000
--- a/integration-testing/cypress/plugins/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
-
-module.exports = (on, config) => {
- // `on` is used to hook into various events Cypress emits
- // `config` is the resolved Cypress config
-}
diff --git a/integration-testing/cypress/support/commands.js b/integration-testing/cypress/support/commands.js
deleted file mode 100644
index 54575265..00000000
--- a/integration-testing/cypress/support/commands.js
+++ /dev/null
@@ -1,79 +0,0 @@
-// ***********************************************
-// This example commands.js shows you how to
-// create various custom commands and overwrite
-// existing commands.
-//
-// For more comprehensive examples of custom
-// commands please read more here:
-// https://on.cypress.io/custom-commands
-// ***********************************************
-//
-//
-// -- This is a parent command --
-// Cypress.Commands.add('login', (email, password) => { ... })
-//
-//
-// -- This is a child command --
-// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
-//
-//
-// -- This is a dual command --
-// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
-//
-//
-// -- This will overwrite an existing command --
-// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
-
-// https://www.cypress.io/blog/2020/02/12/working-with-iframes-in-cypress/
-Cypress.Commands.add('contentiFrame', (iframe) => {
- // get the iframe > document > body
- // and retry until the body element is not empty
- cy.log('contentiFrame');
-
- return cy
- .get('iframe.appFrame', { log: false })
- .its('0.contentDocument.body')
- .should('not.be.empty')
- // wraps "body" DOM element to allow
- // chaining more Cypress commands, like ".find(...)"
- // https://on.cypress.io/wrap
- .then((body) => cy.wrap(body, { log: false }));
-});
-
-Cypress.Commands.add('connectLogin', (user) => {
- cy.request('POST', 'http://connect:3939/__login__', {
- username: 'admin',
- password: 'password',
- });
-});
-
-Cypress.Commands.add('addServer', () => {
- cy.get('button[data-jupyter-action="rsconnect_jupyter:publish"]')
- .click();
- cy.get('a[id="publish-to-connect"]').click({ force: true });
- cy.wait(1000);
- cy.get('input[id="rsc-server"]').clear().type('http://connect:3939');
- cy.get('input[id="rsc-api-key"]').clear().type(Cypress.env('api_key'));
- cy.get('input[id="rsc-servername"]').clear().type('http://connect:3939');
- cy.get('a[class="btn btn-primary"]').contains(' Add Server')
- .click();
- cy.wait(1000);
- cy.get('span[class="help-block"]').should('not.have.text',"Unable to verify");
-});
-
-Cypress.Commands.add('removeServer', () => {
- cy.get('button[data-jupyter-action="rsconnect_jupyter:publish"]')
- .click();
- cy.get('a[id="publish-to-connect"]').click({ force: true });
- cy.wait(1000);
- cy.get('div[id="rsc-select-server"]')
- .contains('http://connect:3939')
- .get('button[class="pull-right btn btn-danger btn-xs"]')
- .click();
-});
-
-// Cypress.Commands.add('setSessionStorage', (key, value) => {
-// cy.window().then((window) => {
-// window.sessionStorage.setItem(key, value)
-// })
-// })
\ No newline at end of file
diff --git a/integration-testing/cypress/support/e2e.js b/integration-testing/cypress/support/e2e.js
deleted file mode 100644
index d68db96d..00000000
--- a/integration-testing/cypress/support/e2e.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// ***********************************************************
-// This example support/index.js is processed and
-// loaded automatically before your test files.
-//
-// This is a great place to put global configuration and
-// behavior that modifies Cypress.
-//
-// You can change the location of this file or turn off
-// automatically serving support files with the
-// 'supportFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/configuration
-// ***********************************************************
-
-// Import commands.js using ES2015 syntax:
-import './commands'
-
-// Alternatively you can use CommonJS syntax:
-// require('./commands')
diff --git a/integration-testing/docker-compose.yml b/integration-testing/docker-compose.yml
index 2ca1db0a..6cf6c5ac 100644
--- a/integration-testing/docker-compose.yml
+++ b/integration-testing/docker-compose.yml
@@ -1,33 +1,15 @@
version: '3'
services:
- client:
- image: client
- hostname: client
- healthcheck:
- test: ["CMD", "curl", "-f", "http://client:9999/tree"]
- interval: 40s
- timeout: 3s
- retries: 30
- ports:
- - 9999:9999
- build:
- context: ./docker
- dockerfile: client.Dockerfile
- volumes:
- - ../:/rsconnect-python
- working_dir: /rsconnect-python/integration-testing
- entrypoint: ''
-
client-cli:
- build:
+ build:
context: ./docker
dockerfile: cli.Dockerfile
- args:
+ args:
QUARTO_VERSION: ${QUARTO_VERSION}
PY_VERSION: ${PY_VERSION}
volumes:
- - ../:/rsconnect-python
+ - ../:/rsconnect-python
working_dir: /rsconnect-python/integration-testing
network_mode: host
entrypoint: ''
@@ -42,10 +24,10 @@ services:
connect-cli:
hostname: connect-cli
image: rstudio/rstudio-connect:jammy
- build:
+ build:
context: ./docker
dockerfile: connect.Dockerfile
- args:
+ args:
QUARTO_VERSION: ${QUARTO_VERSION}
PY_VERSION: ${PY_VERSION}
restart: always
@@ -60,7 +42,7 @@ services:
QUARTO_VERSION: ${QUARTO_VERSION}
PY_VERSION: ${PY_VERSION}
- # connect from public docker hub
+ # connect from public docker hub
# used jupyter-notebook and deploy tests in CI, main.yml
connect:
hostname: connect
@@ -74,19 +56,3 @@ services:
environment:
RSTUDIO_CONNECT_HASTE: "enabled"
RSC_LICENSE: ${CONNECT_LICENSE}
-
-
- cypress:
- image: cypress/included:12.7.0
- depends_on:
- client:
- condition: service_healthy
- build:
- context: ./docker
- dockerfile: cypress.Dockerfile
- volumes:
- - ../:/rsconnect-python
- working_dir: /rsconnect-python/integration-testing/
- environment:
- ADMIN_API_KEY: ${ADMIN_API_KEY}
- entrypoint: ''
diff --git a/integration-testing/docker/cli.Dockerfile b/integration-testing/docker/cli.Dockerfile
index 7913e6b0..e5040141 100644
--- a/integration-testing/docker/cli.Dockerfile
+++ b/integration-testing/docker/cli.Dockerfile
@@ -1,6 +1,5 @@
ARG PY_VERSION=${PY_VERSION}
FROM python:${PY_VERSION}
-COPY ./requirements.txt .
EXPOSE 9999
VOLUME ../../:/rsconnect-python/
@@ -35,11 +34,7 @@ RUN curl -fsSL -o miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-py
&& ./miniconda.sh -b -p /opt/miniconda \
&& rm -rf miniconda.sh
-RUN pip install rsconnect-jupyter --pre && \
- pip install pipenv && \
- jupyter-nbextension install --sys-prefix --py rsconnect_jupyter
-
RUN curl -fsSLO https://github.com/quarto-dev/quarto-cli/releases/download/v${QUARTO_VERSION}/quarto-${QUARTO_VERSION}-linux-amd64.tar.gz && \
mkdir /opt/quarto && tar xf quarto-${QUARTO_VERSION}-linux-amd64.tar.gz -C /opt/quarto --strip-components 1 && \
( echo ""; echo 'export PATH=$PATH:/opt/quarto/bin' ; echo "" ) >> ~/.profile && \
- . ~/.profile
\ No newline at end of file
+ . ~/.profile
diff --git a/integration-testing/docker/client.Dockerfile b/integration-testing/docker/client.Dockerfile
deleted file mode 100644
index 71a81125..00000000
--- a/integration-testing/docker/client.Dockerfile
+++ /dev/null
@@ -1,27 +0,0 @@
-FROM python:3.12
-COPY ./requirements.txt .
-EXPOSE 9999
-VOLUME ../../:/rsconnect-python/
-
-WORKDIR /rsconnect-python/integration-testing
-
-RUN apt-get update && \
- apt-get -y install sudo
-
-RUN mkdir -p /libs-client && \
- curl -fsSL https://github.com/casey/just/releases/download/1.1.2/just-1.1.2-x86_64-unknown-linux-musl.tar.gz \
- | tar -C /libs-client -xz just
-
-ENV PATH=$PATH:/libs-client
-
-RUN pip install rsconnect-jupyter --pre && \
- pip install pipenv && \
- jupyter-nbextension install --sys-prefix --py rsconnect_jupyter
-
-CMD cd ../ && \
- rm -rf ~/.jupyter/ && \
- pip install . && \
- jupyter-nbextension enable --sys-prefix --py rsconnect_jupyter && \
- jupyter-serverextension enable --sys-prefix --py rsconnect_jupyter && \
- jupyter-notebook \
- -y --ip='0.0.0.0' --port=9999 --no-browser --NotebookApp.token='' --allow-root
diff --git a/integration-testing/docker/cypress.Dockerfile b/integration-testing/docker/cypress.Dockerfile
deleted file mode 100644
index 24495820..00000000
--- a/integration-testing/docker/cypress.Dockerfile
+++ /dev/null
@@ -1,14 +0,0 @@
-FROM cypress/included:13.6.4
-
-RUN apt-get update -y && apt-get install -y --no-install-recommends \
- jq \
- curl
-
-RUN mkdir -p /libs-cypress && \
- curl -fsSL https://github.com/casey/just/releases/download/1.1.2/just-1.1.2-x86_64-unknown-linux-musl.tar.gz \
- | tar -C /libs-cypress -xz just
-
-ENV ADMIN_API_KEY=${ADMIN_API_KEY}
-ENV PATH=$PATH:/libs-cypress
-CMD cypress run --browser chrome --env api_key=${ADMIN_API_KEY}
-# CMD run cypress:open --env api_key=${ADMIN_API_KEY}
diff --git a/integration-testing/docker/requirements.txt b/integration-testing/docker/requirements.txt
deleted file mode 100644
index d54fbe44..00000000
--- a/integration-testing/docker/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-rsconnect-jupyter
diff --git a/integration-testing/justfile b/integration-testing/justfile
deleted file mode 100644
index 5e654997..00000000
--- a/integration-testing/justfile
+++ /dev/null
@@ -1,77 +0,0 @@
-export RSC_LICENSE := env_var_or_default("RSC_LICENSE", "$CONNECT_LICENSE")
-export ADMIN_API_KEY := env_var_or_default('ADMIN_API_KEY', "${ADMIN_API_KEY}")
-export QUARTO_VERSION := env_var_or_default('QUARTO_VERSION', '1.4.546')
-
-
-all:
- just up && just up-cypress
-
-build:
- ADMIN_API_KEY=${ADMIN_API_KEY} \
- docker compose build
-
-up:
- docker compose pull connect && \
- docker compose up -d client && docker compose up -d connect
-
-up-cypress:
- docker compose up cypress --exit-code-from cypress
-
-# use this target if you want to run Cypress
-# without shutting down all containers after each run
-up-cypress-local:
- docker compose up cypress
-
-run-client:
- docker compose exec -it \
- client \
- just setup-client
-
-setup-client:
- #!/bin/bash
- python -m venv ./client-python/ && \
- . ./client-python/bin/activate && \
- cd ../ && \
- pip install . && \
- jupyter-nbextension enable --sys-prefix --py rsconnect_jupyter && \
- jupyter-serverextension enable --sys-prefix --py rsconnect_jupyter && \
- jupyter-notebook \
- -y --ip='0.0.0.0' --port=9999 --no-browser --NotebookApp.token='' --allow-root
-
-run-connect:
- docker compose exec -it \
- connect
-
-run-cypress:
- docker compose exec --rm \
- cypress \
- cypress run --browser chrome
-
-bash-cypress:
- docker compose run --rm cypress \
- /bin/bash
-
-bash-client:
- docker compose run --rm client \
- /bin/bash
-
-bash-connect:
- docker compose run --rm connect \
- /bin/bash
-
-inspect-client:
- docker compose exec -it client /bin/bash
-
-inspect-cypress:
- docker compose exec -it cypress /bin/bash
-
-inspect-connect:
- docker compose exec -it connect /bin/bash
-
-stop:
- docker compose down --volumes --remove-orphans && \
- rm -rf ../dist/rsconnect_python-*.whl
-
-rm-config:
- docker compose exec -it client \
- rm -rf /root/.jupyter