def test_check_failing_distribution(monkeypatch): renderer = pretend.stub( render=pretend.call_recorder(lambda *a, **kw: None)) package = pretend.stub(metadata_dictionary=lambda: { "description": "blah", "description_content_type": 'text/markdown', }) output_stream = check.StringIO() warning_stream = "WARNING" monkeypatch.setattr(check, "_RENDERERS", {None: renderer}) monkeypatch.setattr(check, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( check, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) monkeypatch.setattr(check, "_WarningStream", lambda: warning_stream) assert check.check("dist/*", output_stream=output_stream) assert output_stream.getvalue() == ( "Checking dist/dist.tar.gz: FAILED\n" " `long_description` has syntax errors in markup and would not be " "rendered on PyPI.\n" " WARNING") assert renderer.render.calls == [ pretend.call("blah", stream=warning_stream) ]
def test_check_no_distributions(monkeypatch): stream = check.StringIO() monkeypatch.setattr(check, "_find_dists", lambda a: []) assert not check.check("dist/*", output_stream=stream) assert stream.getvalue() == "No files to check.\n"
def test_check_failing_distribution(monkeypatch): renderer = pretend.stub( render=pretend.call_recorder(lambda *a, **kw: None)) package = pretend.stub(metadata_dictionary=lambda: {"description": "blah"}) output_stream = check.StringIO() warning_stream = "WARNING" monkeypatch.setattr(check, "_RENDERERS", {"": renderer}) monkeypatch.setattr(check, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( check, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) monkeypatch.setattr(check, "_WarningStream", lambda: warning_stream) assert check.check("dist/*", output_stream=output_stream) assert output_stream.getvalue() == ( "Checking distribution dist/dist.tar.gz: Failed\n" "The project's long_description has invalid markup which will not be " "rendered on PyPI. The following syntax errors were detected:\n" "WARNING") assert renderer.render.calls == [ pretend.call("blah", stream=warning_stream) ]
def test_check_passing_distribution(monkeypatch): renderer = pretend.stub( render=pretend.call_recorder(lambda *a, **kw: "valid")) package = pretend.stub(metadata_dictionary=lambda: { "description": "blah", "description_content_type": "text/markdown", }) output_stream = io.StringIO() warning_stream = "" monkeypatch.setattr(check, "_RENDERERS", {None: renderer}) monkeypatch.setattr(commands, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( package_file, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) monkeypatch.setattr(check, "_WarningStream", lambda: warning_stream) assert not check.check("dist/*", output_stream=output_stream) assert output_stream.getvalue() == "Checking dist/dist.tar.gz: PASSED\n" assert renderer.render.calls == [ pretend.call("blah", stream=warning_stream) ]
def test_check_passing_distribution(monkeypatch): renderer = pretend.stub( render=pretend.call_recorder(lambda *a, **kw: "valid") ) package = pretend.stub(metadata_dictionary=lambda: { "description": "blah", 'description_content_type': 'text/markdown', }) output_stream = check.StringIO() warning_stream = "" monkeypatch.setattr(check, "_RENDERERS", {None: renderer}) monkeypatch.setattr(check, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( check, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) monkeypatch.setattr(check, "_WarningStream", lambda: warning_stream) assert not check.check("dist/*", output_stream=output_stream) assert ( output_stream.getvalue() == "Checking distribution dist/dist.tar.gz: Passed\n" ) assert renderer.render.calls == [ pretend.call("blah", stream=warning_stream) ]
def test_check_no_distributions(monkeypatch): stream = check.StringIO() monkeypatch.setattr(check, "_find_dists", lambda a: []) assert not check.check("dist/*", output_stream=stream) assert stream.getvalue() == ""
def test_check_failing_distribution(monkeypatch): renderer = pretend.stub( render=pretend.call_recorder(lambda *a, **kw: None) ) package = pretend.stub(metadata_dictionary=lambda: { "description": "blah", "description_content_type": 'text/markdown', }) output_stream = check.StringIO() warning_stream = "WARNING" monkeypatch.setattr(check, "_RENDERERS", {None: renderer}) monkeypatch.setattr(check, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( check, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) monkeypatch.setattr(check, "_WarningStream", lambda: warning_stream) assert check.check("dist/*", output_stream=output_stream) assert output_stream.getvalue() == ( "Checking distribution dist/dist.tar.gz: Failed\n" "The project's long_description has invalid markup which will not be " "rendered on PyPI. The following syntax errors were detected:\n" "WARNING" ) assert renderer.render.calls == [ pretend.call("blah", stream=warning_stream) ]
def test_check_no_description(monkeypatch, capsys): package = pretend.stub(metadata_dictionary=lambda: { 'description': None, 'description_content_type': None, }) monkeypatch.setattr(check, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( check, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) # used to crash with `AttributeError` output_stream = check.StringIO() check.check("dist/*", output_stream=output_stream) assert output_stream.getvalue() == ( 'Checking dist/dist.tar.gz: PASSED, with warnings\n' ' warning: `long_description_content_type` missing. ' 'defaulting to `text/x-rst`.\n' ' warning: `long_description` missing.\n')
def test_check_no_description(monkeypatch, capsys): package = pretend.stub(metadata_dictionary=lambda: { 'description': None, 'description_content_type': None, }) monkeypatch.setattr(check, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( check, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) # used to crash with `AttributeError` output_stream = check.StringIO() check.check("dist/*", output_stream=output_stream) assert output_stream.getvalue() == ( 'Checking distribution dist/dist.tar.gz: ' 'warning: `long_description_content_type` missing. ' 'defaulting to `text/x-rst`.\n' 'warning: `long_description` missing.\n' 'Passed\n' )
def test_check_passing_distribution_with_none_renderer(content_type, monkeypatch): """Pass when rendering a content type can't fail.""" package = pretend.stub(metadata_dictionary=lambda: { "description": "blah", "description_content_type": content_type, }) monkeypatch.setattr(commands, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( package_file, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) output_stream = io.StringIO() assert not check.check(["dist/*"], output_stream=output_stream) assert output_stream.getvalue() == "Checking dist/dist.tar.gz: PASSED\n"
def test_check_passing_distribution(monkeypatch): renderer = pretend.stub( render=pretend.call_recorder(lambda *a, **kw: "valid")) package = pretend.stub(metadata_dictionary=lambda: {"description": "blah"}) output_stream = check.StringIO() warning_stream = "" monkeypatch.setattr(check, "_RENDERERS", {"": renderer}) monkeypatch.setattr(check, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( check, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) monkeypatch.setattr(check, "_WarningStream", lambda: warning_stream) assert not check.check("dist/*", output_stream=output_stream) assert (output_stream.getvalue() == "Checking distribution dist/dist.tar.gz: Passed\n") assert renderer.render.calls == [ pretend.call("blah", stream=warning_stream) ]
def readme(package): """Checks setup.py's ``long_description`` syntax. This program checks the syntax of the contents of the ``long_description`` field at the package's ``setup()`` function. It verifies it will be correctly displayed at PyPI. """ for k in package: logger.info("Checking python package %s", k) # twine check dist/*.zip from twine.commands.check import check failed = check([k]) if failed: raise RuntimeError("twine check (a.k.a. readme check) %s: FAILED" % k) else: logger.info("twine check (a.k.a. readme check) %s: OK", k)
def test_strict_fails_on_warnings(monkeypatch, capsys): package = pretend.stub(metadata_dictionary=lambda: { "description": None, "description_content_type": None, }) monkeypatch.setattr(commands, "_find_dists", lambda a: ["dist/dist.tar.gz"]) monkeypatch.setattr( package_file, "PackageFile", pretend.stub(from_filename=lambda *a, **kw: package), ) # used to crash with `AttributeError` output_stream = io.StringIO() assert check.check(["dist/*"], output_stream=output_stream, strict=True) assert output_stream.getvalue() == ( "Checking dist/dist.tar.gz: FAILED, due to warnings\n" " warning: `long_description_content_type` missing. " "defaulting to `text/x-rst`.\n" " warning: `long_description` missing.\n")
def build_devtools(obj, twine_check): bootstrap = obj["bootstrap"] condarc_options = obj["condarc_options"] conda_build_config = obj["conda_build_config"] work_dir = obj["work_dir"] upload_channel = obj["upload_channel"] recipe_append = os.path.join(work_dir, "data", "recipe_append.yaml") logger.info( "Using the following channels during build:\n - %s", "\n - ".join(condarc_options["channels"]), ) logger.info("Merging conda configuration files...") conda_config = make_conda_config(conda_build_config, None, recipe_append, condarc_options) recipe_dir = os.path.join(obj["work_dir"], "conda") metadata = get_rendered_metadata(recipe_dir, conda_config) paths = get_output_path(metadata, conda_config) # asserts we're building at the right location for path in paths: assert path.startswith(os.path.join(obj["conda_root"], "conda-bld")), ( 'Output path for build (%s) does not start with "%s" - this ' "typically means this build is running on a shared builder and " "the file ~/.conda/environments.txt is polluted with other " "environment paths. To fix, empty that file and set its mode " "to read-only for all." % (path, os.path.join(obj["conda_root"], "conda-bld"))) # retrieve the current build number(s) for this build build_numbers = [ next_build_number(upload_channel, os.path.basename(k))[0] for k in paths ] # homogenize to the largest build number build_number = max([int(k) for k in build_numbers]) # runs the build using the conda-build API # notice we cannot build from the pre-parsed metadata because it has already # resolved the "wrong" build number. We'll have to reparse after setting the # environment variable BOB_BUILD_NUMBER. bootstrap.set_environment("BOB_BUILD_NUMBER", str(build_number)) with root_logger_protection(): conda_build.api.build(recipe_dir, config=conda_config) # checks if long_description of python package renders fine if twine_check: from twine.commands.check import check package = glob.glob("dist/*.zip") failed = check(package) if failed: raise RuntimeError("twine check (a.k.a. readme check) %s: FAILED" % package[0]) else: logger.info("twine check (a.k.a. readme check) %s: OK", package[0]) git_clean_build(bootstrap.run_cmdline, verbose=(obj["verbose"] >= 3))