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).
9740
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> |
9740
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 variants of some 'circup' functions suitable for 'eric-ide' |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8
|
integration. |
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
|
# |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12
|
# Copyright of the original sources: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13
|
# Copyright (c) 2019 Adafruit Industries |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14
|
# |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16
|
import os |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17
|
import shutil |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19
|
import circup |
11011
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
20
|
import circup.command_utils |
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
21
|
import circup.module |
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
22
|
import circup.shared |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23
|
import requests |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25
|
from PyQt6.QtCore import QCoreApplication |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27
|
from eric7.EricWidgets import EricMessageBox |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30
|
def find_modules(device_path, bundles_list): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32
|
Function to extract metadata from the connected device and available bundles and |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33
|
returns this as a list of Module instances representing the modules on the device. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34
|
|
10900
|
35
|
@param device_path path to the connected board or a disk backend object |
|
36
|
@type str or circup.DiskBackend |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37
|
@param bundles_list list of supported bundles |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38
|
@type list of circup.Bundle |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39
|
@return list of Module instances describing the current state of the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40
|
modules on the connected device |
11011
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
41
|
@rtype list of circup.module.Module |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42
|
""" |
10908
|
43
|
backend = ( |
|
44
|
circup.DiskBackend(device_path, circup.logger) |
|
45
|
if isinstance(device_path, str) |
|
46
|
else device_path |
|
47
|
) |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48
|
result = [] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49
|
try: |
10900
|
50
|
device_modules = backend.get_device_versions() |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51
|
bundle_modules = circup.get_bundle_versions(bundles_list) |
11011
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
52
|
for key, device_metadata in device_modules.items(): |
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
53
|
if key in bundle_modules: |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54
|
path = device_metadata["path"] |
11011
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
55
|
bundle_metadata = bundle_modules[key] |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56
|
repo = bundle_metadata.get("__repo__") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57
|
bundle = bundle_metadata.get("bundle") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58
|
device_version = device_metadata.get("__version__") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59
|
bundle_version = bundle_metadata.get("__version__") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60
|
mpy = device_metadata["mpy"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61
|
compatibility = device_metadata.get("compatibility", (None, None)) |
11011
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
62
|
module_name = ( |
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
63
|
path.split(os.sep)[-1] |
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
64
|
if not path.endswith(os.sep) |
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
65
|
else path[:-1].split(os.sep)[-1] + os.sep |
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
66
|
) |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67
|
result.append( |
11011
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
68
|
circup.module.Module( |
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
69
|
module_name, |
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
70
|
backend, |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71
|
repo, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72
|
device_version, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73
|
bundle_version, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74
|
mpy, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75
|
bundle, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76
|
compatibility, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79
|
except Exception as ex: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80
|
# If it's not possible to get the device and bundle metadata, bail out |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81
|
# with a friendly message and indication of what's gone wrong. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82
|
EricMessageBox.critical( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83
|
None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84
|
QCoreApplication.translate("CircupFunctions", "Find Modules"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85
|
QCoreApplication.translate( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86
|
"CircupFunctions", """<p>There was an error: {0}</p>""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87
|
).format(str(ex)), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90
|
return result |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93
|
def ensure_latest_bundle(bundle): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95
|
Function to ensure that there's a copy of the latest library bundle available so |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96
|
circup can check the metadata contained therein. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98
|
@param bundle reference to the target Bundle object. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99
|
@type circup.Bundle |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101
|
tag = bundle.latest_tag |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102
|
do_update = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103
|
if tag == bundle.current_tag: |
11011
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
104
|
for platform in circup.shared.PLATFORMS: |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105
|
# missing directories (new platform added on an existing install |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106
|
# or side effect of pytest or network errors) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107
|
do_update = do_update or not os.path.isdir(bundle.lib_dir(platform)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109
|
do_update = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111
|
if do_update: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113
|
circup.get_bundle(bundle, tag) |
11011
f1f1c8d0255d
Modified the CircuitPython library management for circup >= 2.0.0.
Detlev Offenbach <detlev@die-offenbachs.de>
diff
changeset
|
114
|
circup.command_utils.tags_data_save_tag(bundle.key, tag) |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115
|
except requests.exceptions.HTTPError as ex: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116
|
EricMessageBox.critical( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117
|
None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118
|
QCoreApplication.translate("CircupFunctions", "Download Bundle"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119
|
QCoreApplication.translate( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120
|
"CircupFunctions", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121
|
"""<p>There was a problem downloading the bundle. Please try""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122
|
""" again in a moment.</p><p>Error: {0}</p>""", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123
|
).format(str(ex)), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127
|
def get_circuitpython_version(device_path): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129
|
Function to return the version number of CircuitPython running on the board |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130
|
connected via ``device_path``, along with the board ID. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132
|
This is obtained from the 'boot_out.txt' file on the device, whose first line |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133
|
will start with something like this: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135
|
Adafruit CircuitPython 4.1.0 on 2019-08-02; |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137
|
While the second line is: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139
|
Board ID:raspberry_pi_pico |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141
|
@param device_path path to the connected board. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143
|
@return tuple with the version string for CircuitPython and the board ID string |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144
|
@rtype tuple of (str, str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147
|
with open(os.path.join(device_path, "boot_out.txt")) as boot: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148
|
version_line = boot.readline() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149
|
circuit_python = version_line.split(";")[0].split(" ")[-3] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150
|
board_line = boot.readline() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151
|
board_id = ( |
9748
|
152
|
board_line[9:].strip() if board_line.startswith("Board ID:") else "" |
9740
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154
|
except FileNotFoundError: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155
|
EricMessageBox.critical( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156
|
None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157
|
QCoreApplication.translate("CircupFunctions", "Download Bundle"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158
|
QCoreApplication.translate( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159
|
"CircupFunctions", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160
|
"""<p>Missing file <b>boot_out.txt</b> on the device: wrong path or""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161
|
""" drive corrupted.</p>""", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164
|
circuit_python, board_id = "", "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166
|
return (circuit_python, board_id) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169
|
def install_module(device_path, device_modules, name, py, mod_names): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171
|
Function to find a connected device and install a given module name. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173
|
Installation is done if it is available in the current module bundle and is not |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174
|
already installed on the device. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176
|
@param device_path path to the connected board |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178
|
@param device_modules list of module metadata from the device |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179
|
@type list of dict |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180
|
@param name name of the module to be installed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182
|
@param py flag indicating if the module should be installed from source or |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183
|
from a pre-compiled module |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184
|
@type bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185
|
@param mod_names dictionary containing metadata from modules that can be generated |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186
|
with circup.get_bundle_versions() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187
|
@type dict |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188
|
@return flag indicating success |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189
|
@rtype bool |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191
|
if not name: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193
|
elif name in mod_names: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194
|
library_path = os.path.join(device_path, "lib") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195
|
if not os.path.exists(library_path): # pragma: no cover |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196
|
os.makedirs(library_path) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197
|
metadata = mod_names[name] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198
|
bundle = metadata["bundle"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199
|
# Grab device modules to check if module already installed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200
|
if name in device_modules: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201
|
# ignore silently |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203
|
if py: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204
|
# Use Python source for module. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205
|
source_path = metadata["path"] # Path to Python source version. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206
|
if os.path.isdir(source_path): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207
|
target = os.path.basename(os.path.dirname(source_path)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208
|
target_path = os.path.join(library_path, target) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209
|
# Copy the directory. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210
|
shutil.copytree(source_path, target_path) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213
|
target = os.path.basename(source_path) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214
|
target_path = os.path.join(library_path, target) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215
|
# Copy file. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216
|
shutil.copyfile(source_path, target_path) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
218
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219
|
# Use pre-compiled mpy modules. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220
|
module_name = os.path.basename(metadata["path"]).replace(".py", ".mpy") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221
|
if not module_name: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
222
|
# Must be a directory based module. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
223
|
module_name = os.path.basename(os.path.dirname(metadata["path"])) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224
|
major_version = circup.CPY_VERSION.split(".")[0] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225
|
bundle_platform = "{0}mpy".format(major_version) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226
|
bundle_path = os.path.join(bundle.lib_dir(bundle_platform), module_name) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227
|
if os.path.isdir(bundle_path): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228
|
target_path = os.path.join(library_path, module_name) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229
|
# Copy the directory. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230
|
shutil.copytree(bundle_path, target_path) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232
|
elif os.path.isfile(bundle_path): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233
|
target = os.path.basename(bundle_path) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234
|
target_path = os.path.join(library_path, target) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235
|
# Copy file. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236
|
shutil.copyfile(bundle_path, target_path) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237
|
return True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239
|
EricMessageBox.critical( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240
|
None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241
|
QCoreApplication.translate("CircupFunctions", "Install Modules"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
242
|
QCoreApplication.translate( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243
|
"CircupFunctions", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244
|
"""<p>The compiled version of module <b>{0}</b> cannot be""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
245
|
""" found.</p>""", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
246
|
).format(name), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
247
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
248
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
249
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
250
|
EricMessageBox.critical( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
251
|
None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
252
|
QCoreApplication.translate("CircupFunctions", "Install Modules"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
253
|
QCoreApplication.translate( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
254
|
"CircupFunctions", """<p>The module name <b>{0}</b> is not known.</p>""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
255
|
).format(name), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
256
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
257
|
return False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
258
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
259
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
260
|
def patch_circup(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
261
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
262
|
Function to patch 'circup' to use our functions adapted to the use within the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
263
|
eric-ide. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
264
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
265
|
circup.ensure_latest_bundle = ensure_latest_bundle |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
266
|
circup.find_modules = find_modules |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
267
|
circup.get_circuitpython_version = get_circuitpython_version |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
268
|
circup.install_module = install_module |