Skip to content

Commit a89558b

Browse files
authored
Allow "check core" command to be run from any Python // Resolve platformio#44 (platformio#45)
* Allow "check core" command to be run from any Python. Resolve platformio#44 * minor fixes * fix namings.
1 parent c434423 commit a89558b

File tree

3 files changed

+62
-48
lines changed

3 files changed

+62
-48
lines changed

get-platformio.py

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

pioinstaller/core.py

Lines changed: 60 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import os
1919
import platform
2020
import subprocess
21-
import sys
2221
import time
2322

2423
import click
@@ -122,13 +121,17 @@ def install_platformio_core(shutdown_piohome=True, develop=False, ignore_pythons
122121

123122

124123
def check(dev=False, auto_upgrade=False, version_requirements=None):
125-
126124
# pylint: disable=bad-option-value, import-outside-toplevel, unused-import, import-error, unused-variable, cyclic-import
127125
from pioinstaller import penv
128126

129127
platformio_exe = os.path.join(
130128
penv.get_penv_bin_dir(), "platformio.exe" if util.IS_WINDOWS else "platformio",
131129
)
130+
python_exe = os.path.join(
131+
penv.get_penv_bin_dir(), "python.exe" if util.IS_WINDOWS else "python"
132+
)
133+
result = {}
134+
132135
if not os.path.isfile(platformio_exe):
133136
raise exception.InvalidPlatformIOCore(
134137
"PlatformIO executable not found in `%s`" % penv.get_penv_bin_dir()
@@ -141,18 +144,35 @@ def check(dev=False, auto_upgrade=False, version_requirements=None):
141144
)
142145

143146
try:
144-
# pylint: disable=bad-option-value, import-outside-toplevel, unused-import, import-error, unused-variable, cyclic-import
145-
import platformio
146-
except ImportError:
147-
raise exception.InvalidPlatformIOCore("Could not import PlatformIO module")
147+
result.update(fetch_python_state(python_exe))
148+
except subprocess.CalledProcessError as e:
149+
error = e.output.decode()
150+
raise exception.InvalidPlatformIOCore(
151+
"Could not import PlatformIO module. Error: %s" % error
152+
)
153+
154+
piocore_version = convert_version(result.get("core_version"))
155+
dev = dev or bool(piocore_version.prerelease if piocore_version else False)
156+
result.update(
157+
{
158+
"core_dir": get_core_dir(),
159+
"cache_dir": get_cache_dir(),
160+
"penv_dir": penv.get_penv_dir(),
161+
"penv_bin_dir": penv.get_penv_bin_dir(),
162+
"platformio_exe": platformio_exe,
163+
"installer_version": __version__,
164+
"python_exe": python_exe,
165+
"system": util.get_systype(),
166+
"is_develop_core": dev,
167+
}
168+
)
148169

149-
pio_version = get_pio_version(platformio)
150170
if version_requirements:
151171
try:
152-
if pio_version in semantic_version.Spec(version_requirements):
172+
if piocore_version in semantic_version.Spec(version_requirements):
153173
raise exception.InvalidPlatformIOCore(
154174
"PlatformIO Core version %s does not match version requirements %s."
155-
% (str(pio_version), version_requirements)
175+
% (str(piocore_version), version_requirements)
156176
)
157177
except ValueError:
158178
click.secho(
@@ -161,46 +181,28 @@ def check(dev=False, auto_upgrade=False, version_requirements=None):
161181
% version_requirements
162182
)
163183

164-
state = None
165-
166184
with open(os.path.join(penv.get_penv_dir(), "state.json")) as fp:
167-
state = json.load(fp)
168-
if state.get("platform") != platform.platform():
185+
penv_state = json.load(fp)
186+
if penv_state.get("platform") != platform.platform():
169187
raise exception.InvalidPlatformIOCore(
170188
"PlatformIO installed using another platform `%s`. Your platform: %s"
171-
% (state.get("platform"), platform.platform())
189+
% (penv_state.get("platform"), platform.platform())
172190
)
173191

174192
try:
175193
subprocess.check_output([platformio_exe, "--version"], stderr=subprocess.STDOUT)
176194
except subprocess.CalledProcessError as e:
177195
error = e.output.decode()
178196
raise exception.InvalidPlatformIOCore(
179-
"Could not run `%s --version`.\nError: %s" % (platformio, str(error))
197+
"Could not run `%s --version`.\nError: %s" % (platformio_exe, str(error))
180198
)
181199

182-
dev = dev or bool(pio_version.prerelease)
183-
result = {
184-
"core_dir": get_core_dir(),
185-
"cache_dir": get_cache_dir(),
186-
"penv_dir": penv.get_penv_dir(),
187-
"penv_bin_dir": penv.get_penv_bin_dir(),
188-
"platformio_exe": platformio_exe,
189-
"core_version": str(pio_version),
190-
"installer_version": __version__,
191-
"python_exe": os.path.join(
192-
penv.get_penv_bin_dir(), "python.exe" if util.IS_WINDOWS else "python"
193-
),
194-
"system": util.get_systype(),
195-
"is_develop_core": dev,
196-
}
197-
198200
if not auto_upgrade:
199201
return result
200202

201203
time_now = int(round(time.time()))
202204

203-
last_piocore_version_check = state.get("last_piocore_version_check")
205+
last_piocore_version_check = penv_state.get("last_piocore_version_check")
204206

205207
if (
206208
last_piocore_version_check
@@ -209,31 +211,43 @@ def check(dev=False, auto_upgrade=False, version_requirements=None):
209211
return result
210212

211213
with open(os.path.join(penv.get_penv_dir(), "state.json"), "w") as fp:
212-
state["last_piocore_version_check"] = time_now
213-
json.dump(state, fp)
214+
penv_state["last_piocore_version_check"] = time_now
215+
json.dump(penv_state, fp)
214216

215217
if not last_piocore_version_check:
216218
return result
217219

218220
upgrade_core(platformio_exe, dev)
219221

220-
result["core_version"] = get_pio_version(platformio)
221-
222+
try:
223+
result.update(fetch_python_state(python_exe))
224+
except: # pylint:disable=bare-except
225+
raise exception.InvalidPlatformIOCore("Could not import PlatformIO module")
222226
return result
223227

224228

225-
def get_pio_version(platformio):
229+
def fetch_python_state(python_exe):
230+
code = """import platform
231+
import json
232+
import platformio
233+
234+
state = {
235+
"core_version": platformio.__version__,
236+
"python_version": platform.python_version()
237+
}
238+
print(json.dumps(state))
239+
"""
240+
state = subprocess.check_output(
241+
[python_exe, "-c", code,], stderr=subprocess.STDOUT,
242+
)
243+
return json.loads(state.decode())
244+
245+
246+
def convert_version(version):
226247
try:
227-
if sys.version_info[0] == 3:
228-
# pylint: disable=bad-option-value, import-outside-toplevel, unused-import, import-error, unused-variable, cyclic-import
229-
import importlib
230-
231-
importlib.reload(platformio) # pylint:disable=no-member
232-
else:
233-
reload(platformio)
234-
return semantic_version.Version(util.pepver_to_semver(platformio.__version__))
248+
return semantic_version.Version(util.pepver_to_semver(version))
235249
except: # pylint:disable=bare-except
236-
return platformio.__version__
250+
return None
237251

238252

239253
def upgrade_core(platformio_exe, dev=False):

tests/test_core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_install_pio_core(pio_installer_script, tmpdir, monkeypatch):
4141
# pio_installer_script,
4242
# "check",
4343
# "core",
44-
# "--dump-state-path=%s" % core_state_path,
44+
# "--dump-state=%s" % core_state_path,
4545
# ]
4646
# )
4747
# == 0

0 commit comments

Comments
 (0)