1- import requests
1+ import json
2+
3+ from qgis .PyQt .QtCore import QByteArray , QObject , QUrl , pyqtSignal
4+ from qgis .PyQt .QtNetwork import QNetworkAccessManager , QNetworkReply , QNetworkRequest
25
36from ..utils .plugin_utils import PluginUtils
47from .module_package import ModulePackage
58
69
7- class Module :
8- def __init__ (self , name : str , organisation : str , repository : str ):
10+ class Module (QObject ):
11+ signal_versionsLoaded = pyqtSignal (str )
12+ signal_developmentVersionsLoaded = pyqtSignal (str )
13+
14+ def __init__ (self , name : str , organisation : str , repository : str , parent = None ):
15+ super ().__init__ (parent )
916 self .name = name
1017 self .organisation = organisation
1118 self .repository = repository
1219 self .versions = []
1320 self .development_versions = []
1421 self .latest_version = None
22+ self .network_manager = QNetworkAccessManager (self )
1523
1624 def __repr__ (self ):
1725 return f"Module(name={ self .name } , organisation={ self .organisation } , repository={ self .repository } )"
1826
19- def load_versions (self ):
20- r = requests .get (
21- f"https://api.github.com/repos/{ self .organisation } /{ self .repository } /releases" ,
22- headers = PluginUtils .get_github_headers (),
23- )
24-
25- # Raise an exception in case of http errors
26- r .raise_for_status ()
27-
28- json_versions = r .json ()
29- self .versions = []
30- self .latest_version = None
31- for json_version in json_versions :
32- module_package = ModulePackage (
33- module = self ,
34- organisation = self .organisation ,
35- repository = self .repository ,
36- json_payload = json_version ,
37- type = ModulePackage .Type .RELEASE ,
38- )
39- self .versions .append (module_package )
40-
41- # Latest version -> most recent commit date for non prerelease
42- if module_package .prerelease is True :
43- continue
44-
45- if self .latest_version is None :
46- self .latest_version = module_package
47- continue
48-
49- if module_package .created_at > self .latest_version .created_at :
50- self .latest_version = module_package
51-
52- def load_development_versions (self ):
53-
27+ def start_load_versions (self ):
28+ url = QUrl (f"https://api.github.com/repos/{ self .organisation } /{ self .repository } /releases" )
29+ request = QNetworkRequest (url )
30+ headers = PluginUtils .get_github_headers ()
31+ for key , value in headers .items ():
32+ request .setRawHeader (QByteArray (key .encode ()), QByteArray (value .encode ()))
33+ reply = self .network_manager .get (request )
34+ reply .finished .connect (lambda : self ._on_versions_reply (reply ))
35+
36+ def _on_versions_reply (self , reply ):
37+ if reply .error () is not QNetworkReply .NetworkError .NoError :
38+ print (f"request sent: { reply .request ().url ()} " )
39+ print (f"reply error: { reply .error ()} " )
40+ self .signal_versionsLoaded .emit (reply .errorString ())
41+ reply .deleteLater ()
42+ return
43+ try :
44+ data = reply .readAll ().data ()
45+ json_versions = json .loads (data .decode ())
46+ self .versions = []
47+ self .latest_version = None
48+ for json_version in json_versions :
49+ module_package = ModulePackage (
50+ module = self ,
51+ organisation = self .organisation ,
52+ repository = self .repository ,
53+ json_payload = json_version ,
54+ type = ModulePackage .Type .RELEASE ,
55+ )
56+ self .versions .append (module_package )
57+
58+ # Latest version -> most recent commit date for non prerelease
59+ if module_package .prerelease is True :
60+ continue
61+
62+ if self .latest_version is None :
63+ self .latest_version = module_package
64+ continue
65+
66+ if module_package .created_at > self .latest_version .created_at :
67+ self .latest_version = module_package
68+ self .signal_versionsLoaded .emit ("" )
69+ except Exception as e :
70+ self .signal_versionsLoaded .emit (str (e ))
71+ reply .deleteLater ()
72+
73+ def start_load_development_versions (self ):
5474 self .development_versions = []
5575
5676 # Create version for the main branch
@@ -65,22 +85,33 @@ def load_development_versions(self):
6585 )
6686 self .development_versions .append (mainVersion )
6787
68- # Load versions from pull requests
69- r = requests .get (
70- f"https://api.github.com/repos/{ self .organisation } /{ self .repository } /pulls" ,
71- headers = PluginUtils .get_github_headers (),
72- )
73-
74- # Raise an exception in case of http errors
75- r .raise_for_status ()
76-
77- json_versions = r .json ()
78- for json_version in json_versions :
79- module_package = ModulePackage (
80- module = self ,
81- organisation = self .organisation ,
82- repository = self .repository ,
83- json_payload = json_version ,
84- type = ModulePackage .Type .PULL_REQUEST ,
85- )
86- self .development_versions .append (module_package )
88+ url = QUrl (f"https://api.github.com/repos/{ self .organisation } /{ self .repository } /pulls" )
89+ request = QNetworkRequest (url )
90+ headers = PluginUtils .get_github_headers ()
91+ for key , value in headers .items ():
92+ request .setRawHeader (QByteArray (key .encode ()), QByteArray (value .encode ()))
93+ reply = self .network_manager .get (request )
94+ reply .finished .connect (lambda : self ._on_development_versions_reply (reply ))
95+
96+ def _on_development_versions_reply (self , reply ):
97+ if reply .error () is not QNetworkReply .NetworkError .NoError :
98+ self .signal_developmentVersionsLoaded .emit (reply .errorString ())
99+ reply .deleteLater ()
100+ return
101+
102+ try :
103+ data = reply .readAll ().data ()
104+ json_versions = json .loads (data .decode ())
105+ for json_version in json_versions :
106+ module_package = ModulePackage (
107+ module = self ,
108+ organisation = self .organisation ,
109+ repository = self .repository ,
110+ json_payload = json_version ,
111+ type = ModulePackage .Type .PULL_REQUEST ,
112+ )
113+ self .development_versions .append (module_package )
114+ self .signal_developmentVersionsLoaded .emit ("" )
115+ except Exception as e :
116+ self .signal_developmentVersionsLoaded .emit (str (e ))
117+ reply .deleteLater ()
0 commit comments