9979
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1
|
# -*- coding: utf-8 -*- |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
3
|
# Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de> |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4
|
# |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7
|
Module implementing a MicroPython package installer for devices missing the onboard |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8
|
'mip' package. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11
|
import json |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13
|
from PyQt6.QtCore import QEventLoop, QObject, QUrl |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14
|
from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkReply, QNetworkRequest |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16
|
from eric7.EricNetwork.EricNetworkProxyFactory import proxyAuthenticationRequired |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18
|
MicroPythonPackageIndex = "https://micropython.org/pi/v2" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21
|
class MipLocalInstaller(QObject): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23
|
Class implementing a MicroPython package installer ('mip' replacement). |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26
|
def __init__(self, device, parent=None): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28
|
Constructor |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30
|
@param device reference to the connected device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31
|
@type BaseDevice |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32
|
@param parent reference to the parent object (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33
|
@type QObject (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35
|
super().__init__(parent) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37
|
self.__device = device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38
|
self.__error = "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40
|
self.__networkManager = QNetworkAccessManager(self) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41
|
self.__networkManager.proxyAuthenticationRequired.connect( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42
|
proxyAuthenticationRequired |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45
|
self.__loop = QEventLoop() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46
|
self.__networkManager.finished.connect(self.__loop.quit) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48
|
def __rewriteUrl(self, url, branch=None): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50
|
Private method to rewrite the given URL in case of a Github URL. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52
|
@param url URL to be checked and potentially changed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54
|
@param branch branch name (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55
|
@type str (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56
|
@return rewritten URL |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59
|
if url.startswith("github:"): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60
|
urlList = url[7:].split("/") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61
|
if branch is None: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62
|
branch = "HEAD" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63
|
url = ( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64
|
"https://raw.githubusercontent.com/" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65
|
+ urlList[0] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66
|
+ "/" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67
|
+ urlList[1] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68
|
+ "/" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69
|
+ branch |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70
|
+ "/" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71
|
+ "/".join(urlList[2:]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74
|
return url |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76
|
def __getFile(self, fileUrl): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78
|
Private method to download the requested file. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80
|
@param fileUrl URL of the requested file |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81
|
@type QUrl |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82
|
@return package data or an error message and a success flag |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83
|
@rtype tuple of (bytes or str, bool) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85
|
request = QNetworkRequest(fileUrl) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86
|
reply = self.__networkManager.get(request) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87
|
if not self.__loop.isRunning(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88
|
self.__loop.exec() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89
|
if reply.error() != QNetworkReply.NetworkError.NoError: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90
|
return reply.errorString(), False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92
|
return bytes(reply.readAll()), True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94
|
def __installFile(self, fileUrl, targetDir, targetFile): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96
|
Private method to download a file and copy the data to the given target |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97
|
directory. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99
|
@param fileUrl URL of the file to be downloaded and installed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101
|
@param targetDir target directory on the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103
|
@param targetFile file name on the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105
|
@return flag indicating success |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108
|
fileData, ok = self.__getFile(fileUrl) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109
|
if not ok: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110
|
self.__error = fileData |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114
|
targetFilePath = "{0}/{1}".format(targetDir, targetFile) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115
|
self.__device.ensurePath(targetFilePath.rsplit("/", 1)[0]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116
|
self.__device.putData(targetFilePath, fileData) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117
|
except OSError as err: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118
|
self.__error = err |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123
|
def __installJson(self, packageJson, version, mpy, target, index): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125
|
Private method to install a package and its dependencies as defined by the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126
|
package JSON file. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128
|
@param packageJson dictionary containing the package data |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129
|
@type dict |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130
|
@param version package version |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132
|
@param mpy flag indicating to install as '.mpy' file |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133
|
@type bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134
|
@param target target directory on the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136
|
@param index URL of the package index to be used |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138
|
@return flag indicating success |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141
|
for targetFile, shortHash in packageJson.get("hashes", ()): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142
|
fileUrl = QUrl("{0}/file/{1}/{2}".format(index, shortHash[:2], shortHash)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143
|
if not self.__installFile(fileUrl, target, targetFile): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146
|
for targetFile, url in packageJson.get("urls", ()): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147
|
if not self.__installFile( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148
|
self.__rewriteUrl(url, branch=version), target, targetFile |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149
|
): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152
|
for dependency, dependencyVersion in packageJson.get("deps", ()): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153
|
self.installPackage(dependency, dependencyVersion, mpy, target=target) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157
|
def installPackage(self, package, index=None, target=None, version=None, mpy=True): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159
|
Public method to install a MicroPython package. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161
|
@param package package name |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163
|
@param index URL of the package index to be used (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164
|
@type str (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165
|
@param target target directory on the device (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166
|
@type str (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167
|
@param version package version (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168
|
@type str (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169
|
@param mpy flag indicating to install as '.mpy' file (defaults to True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170
|
@type bool (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171
|
@return flag indicating success |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174
|
self.__error = "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176
|
if not bool(index): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177
|
index = MicroPythonPackageIndex |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178
|
index = index.rstrip("/") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180
|
if not target: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181
|
libPaths = self.__device.getLibPaths() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182
|
if libPaths and libPaths[0]: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183
|
target = libPaths[0] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185
|
self.__error = self.tr( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186
|
"Unable to find 'lib' in sys.path. Please enter a target." |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190
|
if package.startswith(("http://", "https://", "github:")): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191
|
if package.endswith(".py") or package.endswith(".mpy"): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192
|
return self.__installFile( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193
|
self.__rewriteUrl(package, version), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194
|
target, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195
|
package.rsplit("/", 1)[-1], |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198
|
if not package.endswith(".json"): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199
|
if not package.endswith("/"): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200
|
package += "/" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201
|
package += "package.json" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203
|
if not version: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204
|
version = "latest" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206
|
mpyVersion = "py" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207
|
if mpy and self.__device.getDeviceData("mpy_file_version") > 0: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208
|
mpyVersion = self.__device.getDeviceData("mpy_file_version") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210
|
packageJsonUrl = QUrl( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211
|
"{0}/package/{1}/{2}/{3}.json".format( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212
|
index, mpyVersion, package, version |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216
|
jsonData, ok = self.__getFile(packageJsonUrl) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217
|
if not ok: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
218
|
self.__error = jsonData |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
222
|
packageJson = json.loads(jsonData.decode("utf-8")) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
223
|
except json.JSONDecodeError as err: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224
|
self.__error = str(err) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227
|
ok = self.__installJson(packageJson, version, mpy, target, index) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228
|
if not ok: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229
|
self.__error += self.tr("\n\nPackage may be partially installed.") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231
|
return ok |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233
|
def errorString(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235
|
Public method to get the last error as a string. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237
|
@return latest error |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238
|
@rtype str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240
|
return self.__error |