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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
`--no-set-default` is passed. `CONNECT_SERVER` still takes precedence.
- New `environment` subcommand for managing execution environments on Connect.
- New `integration` subcommand for managing OAuth integrations on Connect.
- Removed minimum Connect version indicators from CLI help for versions older
than 2024 (e.g. `[v2021.08.0+]`), since those releases are no longer supported.
Indicators for 2024 and newer versions are retained.
- Removed references to Posit Cloud from command help and docstrings, as
publishing to Posit Cloud is no longer supported.

### Added

Expand Down
5 changes: 1 addition & 4 deletions docs/server-administration.md
Original file line number Diff line number Diff line change
Expand Up @@ -215,9 +215,6 @@ of the available search flags.

### Content Build

> **Note**
> The `rsconnect content build` subcommand requires Posit Connect >= 2021.11.1

Posit Connect caches R and Python packages in the configured
[`Server.DataDir`](https://docs.posit.co/connect/admin/appendix/configuration/#Server.DataDir).
Under certain circumstances (examples below), these package caches can become stale
Expand Down Expand Up @@ -249,7 +246,7 @@ The following are some common scenarios where performing a content build might b
rsconnect content build --help
Usage: rsconnect content build [OPTIONS] COMMAND [ARGS]...

Build content on Posit Connect. Requires Connect >= 2021.11.1
Build content on Posit Connect.

Options:
--help Show this message and exit.
Expand Down
2 changes: 1 addition & 1 deletion rsconnect/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ def handle_bad_response(self, response: HTTPResponse | T, is_httpresponse: bool

class PositServer(AbstractRemoteServer):
"""
A class used to represent the server of the shinyapps.io and Posit Cloud APIs.
A class used to represent the server of the shinyapps.io API.
"""

def __init__(self, remote_name: str, url: str, account_name: str, token: str, secret: str):
Expand Down
61 changes: 32 additions & 29 deletions rsconnect/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,21 +248,21 @@ def cloud_shinyapps_args(func: Callable[P, T]) -> Callable[P, T]:
"--account",
"-A",
envvar=["SHINYAPPS_ACCOUNT"],
help="The shinyapps.io/Posit Cloud account name. (Also settable via \
help="The shinyapps.io account name. (Also settable via \
SHINYAPPS_ACCOUNT environment variable.)",
)
@click.option(
"--token",
"-T",
envvar=["SHINYAPPS_TOKEN", "RSCLOUD_TOKEN"],
help="The shinyapps.io/Posit Cloud token. (Also settable via \
help="The shinyapps.io token. (Also settable via \
SHINYAPPS_TOKEN or RSCLOUD_TOKEN environment variables.)",
)
@click.option(
"--secret",
"-S",
envvar=["SHINYAPPS_SECRET", "RSCLOUD_SECRET"],
help="The shinyapps.io/Posit Cloud token secret. \
help="The shinyapps.io token secret. \
(Also settable via SHINYAPPS_SECRET or RSCLOUD_SECRET environment variables.)",
)
@functools.wraps(func)
Expand Down Expand Up @@ -497,7 +497,7 @@ def wrapper(*args: P.args, **kwargs: P.kwargs):
def cli(future: bool):
"""
This command line tool may be used to deploy various types of content to Posit
Connect, Posit Cloud, and shinyapps.io.
Connect and shinyapps.io.

The tool supports the notion of a simple nickname that represents the
information needed to interact with a deployment target. Use the add, list and
Expand Down Expand Up @@ -757,7 +757,7 @@ def bootstrap(

# noinspection SpellCheckingInspection
@cli.command(
short_help="Define a nickname for a Posit Connect, Posit Cloud, or shinyapps.io server and credential.",
short_help="Define a nickname for a Posit Connect or shinyapps.io server and credential.",
help=(
"Associate a simple nickname with the information needed to interact with a deployment target. "
"Specifying an existing nickname will cause its stored information to be replaced by what is given "
Expand Down Expand Up @@ -1349,7 +1349,7 @@ def quickstart(app_type: str, name: str, python_version: Optional[str]):
run_quickstart(app_type=app_type, name=name, python_version=python_version)


@cli.group(no_args_is_help=True, help="Deploy content to Posit Connect, Posit Cloud, or shinyapps.io.")
@cli.group(no_args_is_help=True, help="Deploy content to Posit Connect or shinyapps.io.")
def deploy():
pass

Expand Down Expand Up @@ -1563,7 +1563,7 @@ def deploy_notebook(
# noinspection SpellCheckingInspection,DuplicatedCode
@deploy.command(
name="voila",
short_help="Deploy Jupyter notebook in Voila mode to Posit Connect [v2023.03.0+].",
short_help="Deploy Jupyter notebook in Voila mode to Posit Connect.",
help=("Deploy a Jupyter notebook in Voila mode to Posit Connect."),
no_args_is_help=True,
)
Expand Down Expand Up @@ -1731,9 +1731,9 @@ def deploy_voila(
# noinspection SpellCheckingInspection,DuplicatedCode
@deploy.command(
name="manifest",
short_help="Deploy content to Posit Connect, Posit Cloud, or shinyapps.io by manifest.",
short_help="Deploy content to Posit Connect or shinyapps.io by manifest.",
help=(
"Deploy content to Posit Connect, Posit Cloud, or shinyapps.io using an existing manifest.json "
"Deploy content to Posit Connect or shinyapps.io using an existing manifest.json "
'file. The specified file must either be named "manifest.json" or '
'refer to a directory that contains a file named "manifest.json".'
),
Expand Down Expand Up @@ -1821,7 +1821,7 @@ def deploy_manifest(

@deploy.command(
name="bundle",
short_help="Deploy a previously downloaded bundle to Posit Connect, Posit Cloud, or shinyapps.io.",
short_help="Deploy a previously downloaded bundle to Posit Connect or shinyapps.io.",
help=(
"Deploy a content bundle (a .tar.gz file, such as one downloaded from a Connect server) "
"directly to a server. The bundle is uploaded as-is; its existing manifest.json determines "
Expand Down Expand Up @@ -1911,7 +1911,7 @@ def deploy_bundle(

@deploy.command(
name="pyproject",
short_help="Deploy content to Posit Connect, Posit Cloud, or shinyapps.io by pyproject.",
short_help="Deploy content to Posit Connect or shinyapps.io by pyproject.",
help=(
"Deploy content described by a project's pyproject.toml. The given directory must contain "
"a pyproject.toml with a [tool.rsconnect] table specifying app_mode and entrypoint. "
Expand Down Expand Up @@ -2120,11 +2120,11 @@ def quickstart_hint() -> str:
# noinspection SpellCheckingInspection,DuplicatedCode
@deploy.command(
name="quarto",
short_help="Deploy Quarto content to Posit Connect [v2021.08.0+] or Posit Cloud.",
short_help="Deploy Quarto content to Posit Connect.",
help=(
"Deploy a Quarto document or project to Posit Connect or Posit Cloud. Should the content use the Quarto "
"Deploy a Quarto document or project to Posit Connect. Should the content use the Quarto "
'Jupyter engine, an environment file ("requirements.txt") is created and included in the deployment if one '
"does not already exist. Requires Posit Connect 2021.08.0 or later."
"does not already exist."
"\n\n"
"FILE_OR_DIRECTORY is the path to a single-file Quarto document or the directory containing a Quarto project."
),
Expand Down Expand Up @@ -2414,8 +2414,8 @@ def deploy_tensorflow(
# noinspection SpellCheckingInspection,DuplicatedCode
@deploy.command(
name="html",
short_help="Deploy html content to Posit Connect or Posit Cloud.",
help=("Deploy an html file, or directory of html files with entrypoint, to Posit Connect or Posit Cloud."),
short_help="Deploy html content to Posit Connect.",
help=("Deploy an html file, or directory of html files with entrypoint, to Posit Connect."),
no_args_is_help=True,
)
@server_args
Expand Down Expand Up @@ -2550,7 +2550,7 @@ def resolve_requirements_file(directory: str, requirements_file: Optional[str],

def generate_deploy_python(
app_mode: AppMode,
min_version: str,
min_version: Optional[str] = None,
alias: Optional[str] = None,
desc: Optional[str] = None,
):
Expand All @@ -2563,15 +2563,18 @@ def generate_deploy_python(
if desc is None:
desc = app_mode.desc()

# Only surface a minimum Connect version indicator for recent (2024+) versions.
version_note = " [v{version}+]".format(version=min_version) if min_version else ""

# noinspection SpellCheckingInspection
@deploy.command(
name=alias,
short_help="Deploy a {desc} to Posit Connect [v{version}+], Posit Cloud, or shinyapps.io.".format(
short_help="Deploy a {desc} to Posit Connect{version_note} or shinyapps.io.".format(
desc=desc,
version=min_version,
version_note=version_note,
),
help=(
"Deploy a {desc} module to Posit Connect, Posit Cloud, or shinyapps.io (if supported by the platform). "
"Deploy a {desc} module to Posit Connect or shinyapps.io (if supported by the platform). "
'The "directory" argument must refer to an existing directory that contains the application code.'
).format(desc=desc),
no_args_is_help=True,
Expand Down Expand Up @@ -2768,13 +2771,13 @@ def deploy_app(
return deploy_app


generate_deploy_python(app_mode=AppModes.PYTHON_API, min_version="1.8.2")
generate_deploy_python(app_mode=AppModes.PYTHON_API, min_version="1.8.2", alias="flask", desc="Flask API")
generate_deploy_python(app_mode=AppModes.PYTHON_FASTAPI, min_version="2021.08.0")
generate_deploy_python(app_mode=AppModes.DASH_APP, min_version="1.8.2")
generate_deploy_python(app_mode=AppModes.STREAMLIT_APP, min_version="1.8.4")
generate_deploy_python(app_mode=AppModes.BOKEH_APP, min_version="1.8.4")
generate_deploy_python(app_mode=AppModes.PYTHON_SHINY, min_version="2022.07.0")
generate_deploy_python(app_mode=AppModes.PYTHON_API)
generate_deploy_python(app_mode=AppModes.PYTHON_API, alias="flask", desc="Flask API")
generate_deploy_python(app_mode=AppModes.PYTHON_FASTAPI)
generate_deploy_python(app_mode=AppModes.DASH_APP)
generate_deploy_python(app_mode=AppModes.STREAMLIT_APP)
generate_deploy_python(app_mode=AppModes.BOKEH_APP)
generate_deploy_python(app_mode=AppModes.PYTHON_SHINY)
generate_deploy_python(app_mode=AppModes.PYTHON_GRADIO, min_version="2024.12.0")
generate_deploy_python(app_mode=AppModes.PYTHON_PANEL, min_version="2025.10.0")

Expand Down Expand Up @@ -3227,7 +3230,7 @@ def write_manifest_voila(
"deployment. Should the content use the Quarto Jupyter engine, "
'an environment file ("requirements.txt") is created if one does '
"not already exist. All files are created in the same directory "
"as the project. Requires Posit Connect 2021.08.0 or later."
"as the project."
"\n\n"
"FILE_OR_DIRECTORY is the path to a single-file Quarto document or the directory containing a Quarto project."
),
Expand Down Expand Up @@ -4323,7 +4326,7 @@ def _guid_for_current_server(server_url: str) -> Optional[str]:
logger.info("Environment ready. Activate with: source %s/bin/activate" % env_path)


@content.group(no_args_is_help=True, help="Build content on Posit Connect. Requires Connect >= 2021.11.1")
@content.group(no_args_is_help=True, help="Build content on Posit Connect.")
def build():
pass

Expand Down
Loading