#!/usr/bin/env python from __future__ import annotations from sentry.runner import configure configure() import click from sentry.backup.dependencies import ( DependenciesJSONEncoder, dependencies, get_model_name, sorted_dependencies, ) from sentry.testutils.factories import get_fixture_path # noqa encoder = DependenciesJSONEncoder( sort_keys=True, ensure_ascii=True, check_circular=True, allow_nan=True, indent=2, encoding="utf-8", ) @click.command() def main(): """Used for generating fixtures for the model dependency map.""" click.echo("\nThis script can take up to 30 seconds, please be patient...\n") # Do all of the calculation before any file writes, so that we don't end up with partial # overwrites. detailed = {str(k): v for k, v in dependencies().items()} flat = {k: v.flatten() for k, v in detailed.items()} sorted = sorted_dependencies() truncate = [dependencies()[get_model_name(m)].table_name for m in sorted_dependencies()] det_path = get_fixture_path("backup", "model_dependencies", "detailed.json") with open(det_path, "w+") as fixture: fixture.write(encoder.encode(detailed)) flat_path = get_fixture_path("backup", "model_dependencies", "flat.json") with open(flat_path, "w+") as fixture: fixture.write(encoder.encode(flat)) det_path = get_fixture_path("backup", "model_dependencies", "sorted.json") with open(det_path, "w+") as fixture: fixture.write(encoder.encode(sorted)) # Print tables in the order one would need to list them for a TRUNCATE statement. det_path = get_fixture_path("backup", "model_dependencies", "truncate.json") with open(det_path, "w+") as fixture: fixture.write(encoder.encode(truncate)) click.echo( f"\nSuccess! The dependency mapping fixtures at {[det_path, flat_path]} were updated.\n" ) if __name__ == "__main__": main()