src/eric7/MicroPython/MipLocalInstaller.py

Sun, 16 Mar 2025 12:53:12 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 16 Mar 2025 12:53:12 +0100
branch
eric7
changeset 11170
6d6199d668fb
parent 11090
f5f5f5803935
permissions
-rw-r--r--

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

eric ide

mercurial