diff --git a/rsconnect/main.py b/rsconnect/main.py index 40b4f373..620e2063 100644 --- a/rsconnect/main.py +++ b/rsconnect/main.py @@ -4838,11 +4838,10 @@ def _write_framework_manifest( if exists(manifest_path) and not overwrite: raise RSConnectException("manifest.json already exists. Use --overwrite to overwrite.") - resolved_requirements_file = resolve_requirements_file(directory, requirements_file, False) with cli_feedback("Inspecting Python environment"): environment = Environment.create_python_environment( directory, - requirements_file=resolved_requirements_file, + requirements_file=requirements_file, override_python_version=override_python_version, python=python, ) @@ -4866,7 +4865,7 @@ def _write_framework_manifest( r_environment, ) - generate_env = resolved_requirements_file is None + generate_env = requirements_file is None if environment_file_exists and not generate_env: click.secho( " Warning: %s already exists and will not be overwritten." % environment.filename, diff --git a/tests/test_main.py b/tests/test_main.py index 5c47bf61..94a59c2f 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -2153,6 +2153,36 @@ def test_no_package_json(self, tmp_path): assert "package.json" in result.output +class TestWriteManifestFramework: + @pytest.mark.parametrize("existing_requirements", [False, True]) + def test_force_generate_requirements(self, tmp_path, existing_requirements): + (tmp_path / "app.py").write_text("app = object()\n") + requirements = tmp_path / "requirements.txt" + if existing_requirements: + requirements.write_text("old-package==1.0\n") + + runner = CliRunner() + result = runner.invoke(cli, ["write-manifest", "api", "-g", str(tmp_path)]) + assert result.exit_code == 0, result.output + + manifest = json.loads((tmp_path / "manifest.json").read_text()) + assert requirements.read_text().startswith("# requirements.txt generated by rsconnect-python") + assert manifest["files"]["requirements.txt"]["checksum"] == file_checksum(requirements) + + def test_explicit_requirements_file(self, tmp_path): + (tmp_path / "app.py").write_text("app = object()\n") + requirements = tmp_path / "custom-requirements.txt" + requirements.write_text("example-package==1.0\n") + + runner = CliRunner() + result = runner.invoke(cli, ["write-manifest", "api", "-r", requirements.name, str(tmp_path)]) + assert result.exit_code == 0, result.output + + manifest = json.loads((tmp_path / "manifest.json").read_text()) + assert requirements.read_text() == "example-package==1.0\n" + assert manifest["files"][requirements.name]["checksum"] == file_checksum(requirements) + + class TestWriteManifestExcludeRenv: def test_exclude_renv_omits_r_dependencies(self, tmp_path): # A valid renv.lock is present but --exclude-renv must keep R dependencies