Added the Adafruit Feather nRF52840 to the list of known NRF52 boards and changed the list of known CircuitPython boards to be more explicit with respect to Adafruit boards (i.e. VID 0x239A).
9979
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1
|
# -*- coding: utf-8 -*- |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2
|
|
11090
|
3
|
# Copyright (c) 2023 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> |
9979
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 |