Swift: add --force to codegen

This commit is contained in:
Paolo Tranquilli
2022-11-30 14:11:24 +01:00
parent d6aad13a98
commit bb3aa9e908
8 changed files with 92 additions and 15 deletions

View File

@@ -48,6 +48,7 @@ def qlgen_opts(opts):
opts.generated_registry = generated_registry_path()
opts.ql_format = True
opts.swift_dir = paths.swift_dir
opts.force = False
return opts
@@ -430,7 +431,9 @@ def test_format_error(opts, generate, render_manager, run_mock):
generate([schema.Class('A')])
def test_manage_parameters(opts, generate, renderer):
@pytest.mark.parametrize("force", [False, True])
def test_manage_parameters(opts, generate, renderer, force):
opts.force = force
ql_a = opts.ql_output / "A.qll"
ql_b = opts.ql_output / "B.qll"
stub_a = opts.ql_stub_output / "A.qll"
@@ -448,7 +451,7 @@ def test_manage_parameters(opts, generate, renderer):
generate([schema.Class('A')])
assert renderer.mock_calls == [
mock.call.manage(generated={ql_a, ql_b, test_a, test_b, import_file()}, stubs={stub_a, stub_b},
registry=opts.generated_registry)
registry=opts.generated_registry, force=force)
]

View File

@@ -75,6 +75,7 @@ def test_managed_render(pystache_renderer, sut):
mock.call.render_name(data.template, data, generator=paths.exe_file.relative_to(paths.swift_dir)),
]
def test_managed_render_with_no_registry(pystache_renderer, sut):
data = mock.Mock(spec=("template",))
text = "some text"
@@ -266,5 +267,70 @@ def test_render_with_extensions(pystache_renderer, sut):
assert_file(expected_output, expected_contents)
def test_managed_render_with_force_not_skipping_generated_file(pystache_renderer, sut):
data = mock.Mock(spec=("template",))
output = paths.swift_dir / "some/output.txt"
some_output = "some output"
registry = paths.swift_dir / "a/registry.list"
write(output, some_output)
write(registry, f"some/output.txt {hash(some_output)} {hash(some_output)}\n")
pystache_renderer.render_name.side_effect = (some_output,)
with sut.manage(generated=(output,), stubs=(), registry=registry, force=True) as renderer:
renderer.render(data, output)
assert renderer.written == {output}
assert_file(output, some_output)
assert_file(registry, f"some/output.txt {hash(some_output)} {hash(some_output)}\n")
assert pystache_renderer.mock_calls == [
mock.call.render_name(data.template, data, generator=paths.exe_file.relative_to(paths.swift_dir)),
]
def test_managed_render_with_force_not_skipping_stub_file(pystache_renderer, sut):
data = mock.Mock(spec=("template",))
stub = paths.swift_dir / "some/stub.txt"
some_output = "// generated some output"
some_processed_output = "// generated some processed output"
registry = paths.swift_dir / "a/registry.list"
write(stub, some_processed_output)
write(registry, f"some/stub.txt {hash(some_output)} {hash(some_processed_output)}\n")
pystache_renderer.render_name.side_effect = (some_output,)
with sut.manage(generated=(), stubs=(stub,), registry=registry, force=True) as renderer:
renderer.render(data, stub)
assert renderer.written == {stub}
assert_file(stub, some_output)
assert_file(registry, f"some/stub.txt {hash(some_output)} {hash(some_output)}\n")
assert pystache_renderer.mock_calls == [
mock.call.render_name(data.template, data, generator=paths.exe_file.relative_to(paths.swift_dir)),
]
def test_managed_render_with_force_ignores_modified_generated_file(sut):
output = paths.swift_dir / "some/output.txt"
some_processed_output = "// some processed output"
registry = paths.swift_dir / "a/registry.list"
write(output, "// something else")
write(registry, f"some/output.txt whatever {hash(some_processed_output)}\n")
with sut.manage(generated=(output,), stubs=(), registry=registry, force=True):
pass
def test_managed_render_with_force_ignores_modified_stub_file_still_marked_as_generated(sut):
stub = paths.swift_dir / "some/stub.txt"
some_processed_output = "// generated some processed output"
registry = paths.swift_dir / "a/registry.list"
write(stub, "// generated something else")
write(registry, f"some/stub.txt whatever {hash(some_processed_output)}\n")
with sut.manage(generated=(), stubs=(stub,), registry=registry, force=True):
pass
if __name__ == '__main__':
sys.exit(pytest.main([__file__] + sys.argv[1:]))