Merge pull request #253 from FoamyGuy/autofile_outside_root_subimports

fix subimport finding for auto-files that are not in the root.
This commit is contained in:
foamyguy 2025-08-19 09:39:55 -05:00 committed by GitHub
commit f2eccab822
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 71 additions and 10 deletions

View file

@ -673,14 +673,15 @@ def imports_from_code(full_content):
return sorted(imports) return sorted(imports)
def get_all_imports( def get_all_imports( # pylint: disable=too-many-arguments,too-many-locals, too-many-branches
backend, auto_file_content, mod_names, current_module, visited=None backend, auto_file_content, auto_file_path, mod_names, current_module, visited=None
): ):
""" """
Recursively retrieve imports from files on the backend Recursively retrieve imports from files on the backend
:param Backend backend: The current backend object :param Backend backend: The current backend object
:param str auto_file_content: Content of the python file to analyse :param str auto_file_content: Content of the python file to analyse
:param str auto_file_path: Path to the python file to analyse
:param list mod_names: Lits of supported bundle mod names :param list mod_names: Lits of supported bundle mod names
:param str current_module: Name of the call context module if recursive call :param str current_module: Name of the call context module if recursive call
:param set visited: Modules previously visited :param set visited: Modules previously visited
@ -714,18 +715,37 @@ def get_all_imports(
install_module = install install_module = install
# possible files for the module: .py or __init__.py (if directory) # possible files for the module: .py or __init__.py (if directory)
file_name = os.path.join(*install_module.split(".")) + ".py" file_name = os.path.join(*install_module.split(".")) + ".py"
exists = backend.file_exists(file_name) try:
file_location = os.path.join(
*auto_file_path.replace(str(backend.device_location), "").split(
"/"
)[:-1]
)
full_location = os.path.join(file_location, file_name)
except TypeError:
# file is in root of CIRCUITPY
full_location = file_name
exists = backend.file_exists(full_location)
if not exists: if not exists:
file_name = os.path.join(*install_module.split("."), "__init__.py") file_name = os.path.join(*install_module.split("."), "__init__.py")
exists = backend.file_exists(file_name) full_location = file_name
exists = backend.file_exists(full_location)
if not exists: if not exists:
continue continue
install_module += ".__init__" install_module += ".__init__"
# get the content and parse it recursively # get the content and parse it recursively
auto_file_content = backend.get_file_content(file_name) auto_file_content = backend.get_file_content(full_location)
if auto_file_content: if auto_file_content:
sub_imports = get_all_imports( sub_imports = get_all_imports(
backend, auto_file_content, mod_names, install_module, visited backend,
auto_file_content,
auto_file_path,
mod_names,
install_module,
visited,
) )
requested_installs.extend(sub_imports) requested_installs.extend(sub_imports)
@ -775,7 +795,9 @@ def libraries_from_auto_file(backend, auto_file, mod_names):
# from file name to module name (in case it's in a subpackage) # from file name to module name (in case it's in a subpackage)
click.secho(f"Finding imports from: {auto_file}", fg="green") click.secho(f"Finding imports from: {auto_file}", fg="green")
current_module = auto_file.rstrip(".py").replace(os.path.sep, ".") current_module = auto_file.rstrip(".py").replace(os.path.sep, ".")
return get_all_imports(backend, auto_file_content, mod_names, current_module) return get_all_imports(
backend, auto_file_content, auto_file, mod_names, current_module
)
def get_device_path(host, port, password, path): def get_device_path(host, port, password, path):

View file

@ -0,0 +1,11 @@
# SPDX-FileCopyrightText: 2021 Jeff Epler for Adafruit Industries
#
# SPDX-License-Identifier: MIT
# pylint: disable=all
import os, sys
import adafruit_bus_device
from adafruit_button import Button
from adafruit_esp32spi import adafruit_esp32spi_socketpool
from adafruit_display_text import wrap_text_to_pixels, wrap_text_to_lines
import adafruit_hid.consumer_control
import import_styles_sub

View file

@ -0,0 +1,5 @@
# SPDX-FileCopyrightText: 2025 Neradoc
#
# SPDX-License-Identifier: MIT
# pylint: disable=all
import adafruit_ntp

View file

@ -0,0 +1,11 @@
# SPDX-FileCopyrightText: 2021 Jeff Epler for Adafruit Industries
#
# SPDX-License-Identifier: MIT
# pylint: disable=all
import os, sys
import adafruit_bus_device
from adafruit_button import Button
from adafruit_esp32spi import adafruit_esp32spi_socketpool
from adafruit_display_text import wrap_text_to_pixels, wrap_text_to_lines
import adafruit_hid.consumer_control
import import_styles_sub

View file

@ -1,3 +1,3 @@
Adafruit CircuitPython 8.1.0 on 2019-08-02; Adafruit CircuitPlayground Express with samd21g18 Adafruit CircuitPython 9.0.0 on 2019-08-02; Adafruit CircuitPlayground Express with samd21g18
Board ID:this_is_a_board Board ID:this_is_a_board
UID:AAAABBBBCCCC UID:AAAABBBBCCCC

View file

@ -0,0 +1,5 @@
# SPDX-FileCopyrightText: 2025 Neradoc
#
# SPDX-License-Identifier: MIT
# pylint: disable=all
import adafruit_ntp

View file

@ -1185,7 +1185,13 @@ def test_get_all_imports():
with open(test_file, "r", encoding="utf8") as fp: with open(test_file, "r", encoding="utf8") as fp:
test_data = fp.read() test_data = fp.read()
result = get_all_imports(backend, test_data, mod_names, current_module="") result = get_all_imports(
backend,
test_data,
os.path.join(backend.device_location, "import_styles.py"),
mod_names,
current_module="",
)
assert result == [ assert result == [
"adafruit_bus_device", "adafruit_bus_device",
@ -1213,7 +1219,7 @@ def test_libraries_from_auto_file_local():
"adafruit_ntp", "adafruit_ntp",
] ]
auto_file = "./tests/import_styles.py" auto_file = "apps/test_app/import_styles.py"
with mock.patch("circup.logger.info") as mock_logger, mock.patch( with mock.patch("circup.logger.info") as mock_logger, mock.patch(
"circup.os.path.isfile", return_value=True "circup.os.path.isfile", return_value=True
@ -1265,6 +1271,7 @@ def test_libraries_from_auto_file_board():
result = libraries_from_auto_file(backend, auto_file, mod_names) result = libraries_from_auto_file(backend, auto_file, mod_names)
assert result == [ assert result == [
"adafruit_ntp",
"adafruit_spd1608", "adafruit_spd1608",
"adafruit_spd1656", "adafruit_spd1656",
"adafruit_ssd1675", "adafruit_ssd1675",