src/eric7/MicroPython/MipLocalInstaller.py

Thu, 11 Jul 2024 14:21:34 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 11 Jul 2024 14:21:34 +0200
branch
eric7
changeset 10840
c8045d0dbaa7
parent 10439
21c28b0f9e41
child 11090
f5f5f5803935
permissions
-rw-r--r--

MicroPython
- Updated the list of known CircuitPython boards for CPy 9.1.0.
- Updated the list of known UF2 capable boards.

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
10439
21c28b0f9e41 Updated copyright for 2024.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9979
diff changeset
3 # Copyright (c) 2023 - 2024 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