11import json
2+ import requests
3+ from functools import cache
24from cfengine_cli .masterfiles .download import (
35 ENTERPRISE_RELEASES_URL ,
46 COMMUNITY_RELEASES_URL ,
2022 write_json ,
2123 CFBSNetworkError ,
2224 CFBSExitError ,
25+ CFBSProgrammerError ,
2326)
2427
2528DOWNLOAD_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"\n Downloading 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
12098def 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
126104def 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