def _add_scripts(self): added = [] entry_points = self.convert_entry_points() scripts_path = Path(self._env.paths["scripts"]) scripts = entry_points.get("console_scripts", []) for script in scripts: name, script = script.split(" = ") module, callable_ = script.split(":") callable_holder = callable_.rsplit(".", 1)[0] script_file = scripts_path.joinpath(name) self._debug( " - Adding the <c2>{}</c2> script to <b>{}</b>".format( name, scripts_path ) ) with script_file.open("w", encoding="utf-8") as f: f.write( decode( SCRIPT_TEMPLATE.format( python=self._env._bin("python"), module=module, callable_holder=callable_holder, callable_=callable_, ) ) ) script_file.chmod(0o755) added.append(script_file) if WINDOWS: cmd_script = script_file.with_suffix(".cmd") cmd = WINDOWS_CMD_TEMPLATE.format( python=self._env._bin("python"), script=name ) self._debug( " - Adding the <c2>{}</c2> script wrapper to <b>{}</b>".format( cmd_script.name, scripts_path ) ) with cmd_script.open("w", encoding="utf-8") as f: f.write(decode(cmd)) added.append(cmd_script) return added
def test_self_update_should_install_all_necessary_elements( app, http, mocker, environ, tmp_dir ): os.environ["POETRY_HOME"] = tmp_dir command = app.find("self update") version = Version.parse(__version__).next_minor.text mocker.patch( "poetry.repositories.pypi_repository.PyPiRepository.find_packages", return_value=[Package("poetry", version)], ) mocker.patch.object(command, "_check_recommended_installation", return_value=None) mocker.patch.object( command, "_get_release_name", return_value="poetry-{}-darwin".format(version) ) mocker.patch("subprocess.check_output", return_value=b"Python 3.8.2") http.register_uri( "GET", command.BASE_URL + "/{}/poetry-{}-darwin.sha256sum".format(version, version), body=FIXTURES.joinpath("poetry-1.0.5-darwin.sha256sum").read_bytes(), ) http.register_uri( "GET", command.BASE_URL + "/{}/poetry-{}-darwin.tar.gz".format(version, version), body=FIXTURES.joinpath("poetry-1.0.5-darwin.tar.gz").read_bytes(), ) tester = CommandTester(command) tester.execute() bin_ = Path(tmp_dir).joinpath("bin") lib = Path(tmp_dir).joinpath("lib") assert bin_.exists() script = bin_.joinpath("poetry") assert script.exists() expected_script = """\ # -*- coding: utf-8 -*- import glob import sys import os lib = os.path.normpath(os.path.join(os.path.realpath(__file__), "../..", "lib")) vendors = os.path.join(lib, "poetry", "_vendor") current_vendors = os.path.join( vendors, "py{}".format(".".join(str(v) for v in sys.version_info[:2])) ) sys.path.insert(0, lib) sys.path.insert(0, current_vendors) if __name__ == "__main__": from poetry.console import main main() """ if not WINDOWS: expected_script = "#!/usr/bin/env python\n" + expected_script assert expected_script == script.read_text() if WINDOWS: bat = bin_.joinpath("poetry.bat") expected_bat = '@echo off\r\npython "{}" %*\r\n'.format( str(script).replace(os.environ.get("USERPROFILE", ""), "%USERPROFILE%") ) assert bat.exists() with bat.open(newline="") as f: assert expected_bat == f.read() assert lib.exists() assert lib.joinpath("poetry").exists()