def test_publish_read_from_environment_variable( fixture_dir: "FixtureDirGetter", environ: None, mocker: "MockerFixture", config: "Config", ): os.environ["POETRY_REPOSITORIES_FOO_URL"] = "https://foo.bar" os.environ["POETRY_HTTP_BASIC_FOO_USERNAME"] = "******" os.environ["POETRY_HTTP_BASIC_FOO_PASSWORD"] = "******" uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_upload = mocker.patch( "poetry.publishing.uploader.Uploader.upload") poetry = Factory().create_poetry(fixture_dir("sample_project")) publisher = Publisher(poetry, NullIO()) publisher.publish("foo", None, None) assert [("bar", "baz")] == uploader_auth.call_args assert [ ("https://foo.bar", ), { "cert": None, "client_cert": None, "dry_run": False }, ] == uploader_upload.call_args
def test_publish_can_publish_to_given_repository( fixture_dir, mocker, config, fixture_name ): uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload") config.merge( { "repositories": {"foo": {"url": "http://foo.bar"}}, "http-basic": {"foo": {"username": "******", "password": "******"}}, } ) mocker.patch("poetry.factory.Factory.create_config", return_value=config) poetry = Factory().create_poetry(fixture_dir(fixture_name)) io = BufferedIO() publisher = Publisher(poetry, io) publisher.publish("foo", None, None) assert [("foo", "bar")] == uploader_auth.call_args assert [ ("http://foo.bar",), {"cert": None, "client_cert": None, "dry_run": False}, ] == uploader_upload.call_args assert "Publishing my-package (1.2.3) to foo" in io.fetch_output()
def test_publish_publishes_to_pypi_by_default(fixture_dir: "FixtureDirGetter", mocker: "MockerFixture", config: "Config"): uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_upload = mocker.patch( "poetry.publishing.uploader.Uploader.upload") poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry._config = config poetry.config.merge( {"http-basic": { "pypi": { "username": "******", "password": "******" } }}) publisher = Publisher(poetry, NullIO()) publisher.publish(None, None, None) assert [("foo", "bar")] == uploader_auth.call_args assert [ ("https://upload.pypi.org/legacy/", ), { "cert": None, "client_cert": None, "dry_run": False }, ] == uploader_upload.call_args
def test_publish_uses_client_cert(fixture_dir: "FixtureDirGetter", mocker: "MockerFixture", config: "Config"): client_cert = "path/to/client.pem" uploader_upload = mocker.patch( "poetry.publishing.uploader.Uploader.upload") poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry._config = config poetry.config.merge({ "repositories": { "foo": { "url": "https://foo.bar" } }, "certificates": { "foo": { "client-cert": client_cert } }, }) publisher = Publisher(poetry, NullIO()) publisher.publish("foo", None, None) assert [ ("https://foo.bar", ), { "cert": None, "client_cert": Path(client_cert), "dry_run": False }, ] == uploader_upload.call_args
def test_publish_can_publish_to_given_repository(fixture_dir, mocker, config): uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_upload = mocker.patch( "poetry.publishing.uploader.Uploader.upload") poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry._config = config poetry.config.merge({ "repositories": { "my-repo": { "url": "http://foo.bar" } }, "http-basic": { "my-repo": { "username": "******", "password": "******" } }, }) publisher = Publisher(poetry, NullIO()) publisher.publish("my-repo", None, None) assert [("foo", "bar")] == uploader_auth.call_args assert [ ("http://foo.bar", ), { "cert": None, "client_cert": None, "dry_run": False }, ] == uploader_upload.call_args
def test_publish_uses_cert( fixture_dir: FixtureDirGetter, mocker: MockerFixture, config: Config ): cert = "path/to/ca.pem" uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload") poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry._config = config poetry.config.merge( { "repositories": {"foo": {"url": "https://foo.bar"}}, "http-basic": {"foo": {"username": "******", "password": "******"}}, "certificates": {"foo": {"cert": cert}}, } ) publisher = Publisher(poetry, NullIO()) publisher.publish("foo", None, None) assert [("foo", "bar")] == uploader_auth.call_args assert [ ("https://foo.bar",), { "cert": Path(cert), "client_cert": None, "dry_run": False, "skip_existing": False, }, ] == uploader_upload.call_args
def test_publish_raises_error_for_undefined_repository(fixture_dir, mocker, config): poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry._config = config poetry.config.merge( {"http-basic": {"my-repo": {"username": "******", "password": "******"}}} ) publisher = Publisher(poetry, NullIO()) with pytest.raises(RuntimeError): publisher.publish("my-repo", None, None)
def test_publish_uses_token_if_it_exists(fixture_dir, mocker, config): uploader_auth = mocker.patch("poetry.publishing.uploader.Uploader.auth") uploader_upload = mocker.patch("poetry.publishing.uploader.Uploader.upload") poetry = Factory().create_poetry(fixture_dir("sample_project")) poetry._config = config poetry.config.merge({"pypi-token": {"pypi": "my-token"}}) publisher = Publisher(poetry, NullIO()) publisher.publish(None, None, None) assert [("__token__", "my-token")] == uploader_auth.call_args assert [ ("https://upload.pypi.org/legacy/",), {"cert": None, "client_cert": None, "dry_run": False}, ] == uploader_upload.call_args
def handle(self): # type: () -> Optional[int] from poetry.publishing.publisher import Publisher publisher = Publisher(self.poetry, self.io) # Building package first, if told if self.option("build"): if publisher.files: if not self.confirm( "There are <info>{}</info> files ready for publishing. " "Build anyway?".format(len(publisher.files)) ): self.line_error("<error>Aborted!</error>") return 1 self.call("build") files = publisher.files if not files: self.line_error( "<error>No files to publish. " "Run poetry build first or use the --build option.</error>" ) return 1 self.line("") cert = Path(self.option("cert")) if self.option("cert") else None client_cert = ( Path(self.option("client-cert")) if self.option("client-cert") else None ) publisher.publish( self.option("repository"), self.option("username"), self.option("password"), cert, client_cert, self.option("dry-run"), )