def test_format_envlist_generator(tmp_path): path = tmp_path / "tox.ini" path.write_text( "[tox]\nenvlist={py36,py37}-django{20,21},{py36,py37}-mango{20,21},py38\n" ) outcome = format_tox_ini(path) assert outcome == "[tox]\nenvlist =\n py38\n {py37, py36}-django{21, 20}\n {py37, py36}-mango{21, 20}\n"
def test_format_tox_ini_handles_trailing_comma(tox_ini): """tox.ini gets formatted without adding additional whitespace This was previously caused by a trailing comma in the `envlist`. """ tox_ini.write_text("[tox]\nenvlist=\n py38,\n pkg,\n" "[testenv:pkg]\na=b\n") result = format_tox_ini(tox_ini) assert result == "[tox]\nenvlist =\n py38\n pkg\n\n[testenv:pkg]\na = b\n"
def test_format_test_env_ref(tox_ini, key, before, pre, post, expected): text = ( f"[testenv]\n{key}={before}\n[testenv:py]" f"\n{key}=\n {pre}\n {{[testenv:x]X}}\n {{[testenv]{key}}}\n {post}\n" ) tox_ini.write_text(text) outcome = format_tox_ini(tox_ini) expected = f"[testenv]\n{key} ={before}\n\n[testenv:py]\n{key} ={expected}\n" assert outcome == expected
def test_tox_section_order(tox_ini): tox_ini.write_text( "[tox]\nskip_missing_interpreters=true\nisolated_build=true\nminversion=3.14\nskipsdist=false\nenvlist=py37" ) outcome = format_tox_ini(tox_ini) assert ( outcome == "[tox]\nenvlist =\n py37\nisolated_build = true\nskipsdist = false\n" "skip_missing_interpreters = true\nminversion = 3.14\n" )
def test_pin(tox_ini): tox_ini.write_text( "[tox]\nenvlist=py38,pkg,py,py39,pypy3,pypy,pin,extra\n" "[testenv:py38]\ne=f\n" "[testenv:pkg]\nc=d\n" "[testenv:py]\ng=h\n" "[testenv:py39]\ni=j\n" "[testenv:pypy3]\nk=l\n" "[testenv:pypy]\nm=n\n" "[testenv:pin]\na=b\n" "[testenv:extra]\no=p\n" ) result = format_tox_ini(tox_ini, ToxIniFmtNamespace(pin_toxenvs=["pin", "pkg"])) expected = dedent( """ [tox] envlist = pin pkg py39 py38 py pypy3 pypy extra [testenv:pin] a = b [testenv:pkg] c = d [testenv:py39] i = j [testenv:py38] e = f [testenv:py] g = h [testenv:pypy3] k = l [testenv:pypy] m = n [testenv:extra] o = p """ ).lstrip() assert result == expected
def test_format_test_env(tox_ini, section): content = dedent( """ usedevelop = True skip_install =\tFalse parallel_show_output = false commands = \te \tf \\ \t \\ \t g extras = \tc,d description = \tdesc\t deps = \tb\t \ta\t basepython=\tpython3.8\t passenv=z y x setenv= C=D E =F A = B """ ).strip() tox_ini.write_text(f"[testenv]\n{content}") outcome = format_tox_ini(tox_ini) expected = dedent( """ [testenv] description = desc passenv = x y z setenv = A = B C = D E = F basepython = python3.8 skip_install = false usedevelop = true deps = a b extras = c d parallel_show_output = false commands = e f \\ g """ ).lstrip() assert outcome == expected
def test_section_order(tox_ini): tox_ini.write_text( dedent( """ [testenv:py37] c = d [testenv] a = b [testenv:dev] g = h [magic] i = j [tox] envlist = py38,py37 e = f """ ) ) result = format_tox_ini(tox_ini) expected = dedent( """ [tox] envlist = py38 py37 e = f [testenv] a = b [testenv:py37] c = d [testenv:dev] g = h [magic] i = j """ ).lstrip() assert result == expected
def run(args: Optional[Sequence[str]] = None) -> int: opts = cli_args(sys.argv[1:] if args is None else args) formatted = format_tox_ini(opts.tox_ini) before = opts.tox_ini.read_text() changed = before != formatted if opts.stdout: # stdout just prints new format to stdout print(formatted, end="") else: opts.tox_ini.write_text(formatted) try: name = str(opts.tox_ini.relative_to(Path.cwd())) except ValueError: name = str(opts.tox_ini) diff = (difflib.unified_diff(before.splitlines(), formatted.splitlines(), fromfile=name, tofile=name) if changed else []) if diff: print("\n".join(diff)) # print diff on change else: print(f"no change for {name}") # exit with non success on change return 1 if changed else 0
def test_pin_missing(tox_ini): tox_ini.write_text("[tox]\nenvlist=py") with pytest.raises(RuntimeError, match=r"missing tox environment\(s\) to pin missing_1, missing_2"): format_tox_ini(tox_ini, ToxIniFmtNamespace(pin_toxenvs=["missing_1", "missing_2"]))
def test_no_tox_section(tox_ini): tox_ini.write_text("") assert format_tox_ini(tox_ini) == "\n"
def test_fail_on_bad_set_env(tox_ini): tox_ini.write_text("[testenv]\nsetenv = A") with pytest.raises(RuntimeError, match="invalid line A in setenv"): format_tox_ini(tox_ini)
def test_tox_fmt_boolean(tox_ini, key, value, result): tox_ini.write_text(f"[tox]\n{key}={value}") outcome = format_tox_ini(tox_ini) expected = f"[tox]\n{key} = {result}\n" assert outcome == expected
def test_format_envlist_start_newline(tox_ini): ok = "[tox]\nenvlist =\n py39\n py38\n" tox_ini.write_text(ok) outcome = format_tox_ini(tox_ini) assert outcome == ok
def test_format_envlist_simple(tox_ini): tox_ini.write_text("[tox]\nenvlist=py39,py38\n") outcome = format_tox_ini(tox_ini) assert outcome == "[tox]\nenvlist =\n py39\n py38\n"