Skip to content

Commit 6c70444

Browse files
committed
ENT-13808: Download releases.json directly to file and parse afterwards
1 parent 0c1c26d commit 6c70444

1 file changed

Lines changed: 33 additions & 36 deletions

File tree

src/cfengine_cli/masterfiles/generate_release_information.py

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import json
2+
import requests
3+
from functools import cache
24
from cfengine_cli.masterfiles.download import (
35
ENTERPRISE_RELEASES_URL,
46
COMMUNITY_RELEASES_URL,
@@ -20,6 +22,7 @@
2022
write_json,
2123
CFBSNetworkError,
2224
CFBSExitError,
25+
CFBSProgrammerError,
2326
)
2427

2528
DOWNLOAD_PATH = "downloaded_masterfiles"
@@ -74,37 +77,12 @@ def generate_release_information_impl(
7477
)
7578

7679

77-
def download_enterprise_releasedata():
78-
# Downloading releases.json:
79-
try:
80-
releases_data = get_json(ENTERPRISE_RELEASES_URL)
81-
82-
except CFBSNetworkError:
83-
raise CFBSExitError(
84-
"Downloading CFEngine release data failed - check your Wi-Fi / network settings."
85-
)
86-
87-
return releases_data
88-
89-
90-
def download_community_releasedata():
91-
# Downloading community/releases.json
92-
try:
93-
releases_data = get_json(COMMUNITY_RELEASES_URL)
94-
95-
except CFBSNetworkError:
96-
raise CFBSExitError(
97-
"Downloading CFEngine release data failed - check your Wi-Fi / network settings."
98-
)
99-
100-
return releases_data
101-
102-
103-
def process_release_type(folder, download_func):
80+
def process_release_type(folder, url):
10481
# Function for processing either community or enterprise releases
105-
release_data = download_func()
106-
107-
write_json_pretty(f"./{folder}/releases.json", release_data)
82+
releases_path = f"./{folder}/releases.json"
83+
print(f"\nDownloading release data for {folder}...")
84+
# Save raw file to preserve exact format from website
85+
release_data = json_get_save_return(url, releases_path)
10886

10987
stable_releases = get_stable_releases(release_data)
11088

@@ -119,8 +97,8 @@ def process_release_type(folder, download_func):
11997

12098
def generate_release_history():
12199
print("Generating release history information...")
122-
process_release_type("cfengine-enterprise", download_enterprise_releasedata)
123-
process_release_type("cfengine-community", download_community_releasedata)
100+
process_release_type("cfengine-enterprise", ENTERPRISE_RELEASES_URL)
101+
process_release_type("cfengine-community", COMMUNITY_RELEASES_URL)
124102

125103

126104
def build_release_history(filtered_releases):
@@ -188,7 +166,26 @@ def write_version_files(stable_releases, folder):
188166
write_json(f"./{folder}/versions/{version}.json", version_data)
189167

190168

191-
def write_json_pretty(path, data):
192-
# Writes release information in same format as on cfengine.com
193-
with open(path, "w", encoding="utf-8") as f:
194-
json.dump(data, f, indent=2, ensure_ascii=False)
169+
@cache
170+
def json_get_save_return(url: str, path: str) -> dict:
171+
try:
172+
r = requests.get(url)
173+
r.raise_for_status()
174+
except requests.exceptions.RequestException:
175+
raise CFBSNetworkError(
176+
f"Downloading of {url} failed - check your Wi-Fi / network settings."
177+
)
178+
content = r.content
179+
180+
try:
181+
with open(path, "wb") as f:
182+
f.write(content)
183+
except OSError:
184+
raise CFBSExitError(f"Failed to open and write content to {path}")
185+
186+
try:
187+
data = json.loads(content)
188+
except json.JSONDecodeError:
189+
raise CFBSExitError(f"Failed to parse JSON from {url}.")
190+
191+
return data

0 commit comments

Comments
 (0)