11import json
2+ import requests
3+ from functools import cache
24from cfengine_cli .masterfiles .download import (
35 ENTERPRISE_RELEASES_URL ,
46 COMMUNITY_RELEASES_URL ,
@@ -29,6 +31,10 @@ def generate_release_information_impl(
2931 omit_download = False , check = False , min_version = None
3032):
3133 if not omit_download :
34+ generate_release_history ()
35+
36+ generate_git_tags_map ()
37+
3238 print ("Downloading masterfiles..." )
3339
3440 downloaded_versions = download_all_versions (DOWNLOAD_PATH , min_version )
@@ -49,10 +55,6 @@ def generate_release_information_impl(
4955 )
5056 generate_vcf_download (DOWNLOAD_PATH , downloaded_versions )
5157
52- generate_release_history ()
53-
54- generate_git_tags_map ()
55-
5658 if check :
5759 print (
5860 "Downloading releases of masterfiles from git (github.com) and generating "
@@ -74,37 +76,12 @@ def generate_release_information_impl(
7476 )
7577
7678
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 ):
79+ def process_release_type (folder , url ):
10480 # Function for processing either community or enterprise releases
105- release_data = download_func ()
106-
107- write_json_pretty (f"./{ folder } /releases.json" , release_data )
81+ releases_path = f"./{ folder } /releases.json"
82+ print (f"\n Downloading release data for { folder } ..." )
83+ # Save raw file to preserve exact format from website
84+ release_data = json_get_save_return (url , releases_path )
10885
10986 stable_releases = get_stable_releases (release_data )
11087
@@ -119,8 +96,8 @@ def process_release_type(folder, download_func):
11996
12097def generate_release_history ():
12198 print ("Generating release history information..." )
122- process_release_type ("cfengine-enterprise" , download_enterprise_releasedata )
123- process_release_type ("cfengine-community" , download_community_releasedata )
99+ process_release_type ("cfengine-enterprise" , ENTERPRISE_RELEASES_URL )
100+ process_release_type ("cfengine-community" , COMMUNITY_RELEASES_URL )
124101
125102
126103def build_release_history (filtered_releases ):
@@ -188,7 +165,26 @@ def write_version_files(stable_releases, folder):
188165 write_json (f"./{ folder } /versions/{ version } .json" , version_data )
189166
190167
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 )
168+ @cache
169+ def json_get_save_return (url : str , path : str ) -> dict :
170+ try :
171+ r = requests .get (url )
172+ r .raise_for_status ()
173+ except requests .exceptions .RequestException :
174+ raise CFBSNetworkError (
175+ f"Downloading of { url } failed - check your Wi-Fi / network settings."
176+ )
177+ content = r .content
178+
179+ try :
180+ with open (path , "wb" ) as f :
181+ f .write (content )
182+ except OSError :
183+ raise CFBSExitError (f"Failed to open and write content to { path } " )
184+
185+ try :
186+ data = json .loads (content )
187+ except json .JSONDecodeError :
188+ raise CFBSExitError (f"Failed to parse JSON from { url } ." )
189+
190+ return data
0 commit comments