From 76513f31ac8757728cc7a02dd05364f6b1213427 Mon Sep 17 00:00:00 2001 From: "Daniel W. Anner" Date: Tue, 26 Sep 2023 10:31:43 -0400 Subject: [PATCH] Adding new script to assist with automatically updating generated JSON (#1635) --- requirements.txt | 1 + scripts/update-schema.py | 59 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 scripts/update-schema.py diff --git a/requirements.txt b/requirements.txt index 71fff4125d..66d5e3e8cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ jsonschema==4.19.0 +jsondiff==2.0.0 pre-commit==3.3.3 pytest==7.4.0 PyYAML==6.0.1 diff --git a/scripts/update-schema.py b/scripts/update-schema.py new file mode 100644 index 0000000000..66ab9d9c52 --- /dev/null +++ b/scripts/update-schema.py @@ -0,0 +1,59 @@ +import json +import jsondiff +import os +from shutil import copy2 +import tempfile +from urllib.request import urlopen, urlretrieve + +releaseData = {} +_releaseURL_ = 'https://api.github.com/repos/netbox-community/netbox/releases/latest' + + +def gather_release_data(): + global releaseData + # Gather Latest release JSON data from the GitHub API + latestRelease = urlopen(_releaseURL_) + + if latestRelease.getcode() == 200: + print("Successfully retrieved latest release data") + releaseData = json.loads(latestRelease.read().decode('utf-8')) + + if 'tag_name' not in releaseData: + print('Error: Could not find tag_name in JSON data') + releaseData.update({'tag_name': 'unknown'}) + + if 'zipball_url' not in releaseData: + print('FATAL Error: Could not find zipball_url in JSON data') + exit(1) + + +def extract_data(releaseTag: str, repo_path: str): + with tempfile.TemporaryDirectory() as tempdir: + tmpfile = f'{tempdir}/generated_schema.json' + urlretrieve(f'https://raw.githubusercontent.com/netbox-community/netbox/{releaseTag}/contrib/generated_schema.json', tmpfile) + + if os.path.isfile(repo_path): + print("Generated JSON already exists, checking diff.") + tmpJSON = open(tmpfile, 'r').read() + repoJSON = open(repo_path, 'r').read() + + if jsondiff.diff(tmpJSON, repoJSON): + print("New JSON data found, updating generated_schema.json") + copy2(tmpfile, repo_path) + else: + print("Generated JSON not found. Copying generated_schema.json") + copy2(tmpfile, repo_path) + + +def __init__(): + print("Initializing release data...") + gather_release_data() + + print("Starting data extract...") + os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..')) + repo_path = os.path.abspath(os.path.join(os.path.dirname( __file__ ), '../schema/generated_schema.json')) + extract_data(releaseData['tag_name'], repo_path) + + print("Completed data extract.") + +__init__() \ No newline at end of file