Skip to content

Commit

Permalink
Rework custom garden importer to avoid usage of imp module (remov…
Browse files Browse the repository at this point in the history
…ed in Python `3.12`) (#8301)

* UPDATE

* Rework custom garden importer to avoid usage of imp module (removed in 3.12)

* Apply black formatting

* Fix flake8 error

---------

Co-authored-by: Mirko Galimberti <me@mirkogalimberti.com>
  • Loading branch information
JoaoRoizenFontana and misl6 committed Oct 29, 2023
1 parent effc770 commit 64d295c
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 17 deletions.
31 changes: 14 additions & 17 deletions kivy/garden/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,9 @@

__path__ = 'kivy.garden'

import importlib.util
from importlib.abc import MetaPathFinder
import sys
import imp
from os.path import dirname, join, realpath, exists, abspath
from kivy import kivy_home_dir
from kivy.utils import platform
Expand All @@ -160,29 +161,25 @@
garden_app_dir = join(dirname(main_py_file), 'libs', 'garden')


class GardenImporter(object):
class GardenImporter(MetaPathFinder):

def find_module(self, fullname, path):
if path == 'kivy.garden':
return self
def find_spec(self, fullname, path, target=None):
if path != "kivy.garden":
return None

def load_module(self, fullname):
assert fullname.startswith('kivy.garden')

moddir = join(garden_kivy_dir, fullname.split('.', 2)[-1])
moddir = join(
garden_kivy_dir, fullname.split(".", 2)[-1], "__init__.py"
)
if exists(moddir):
return self._load_module(fullname, moddir)
return importlib.util.spec_from_file_location(fullname, moddir)

modname = fullname.split('.', 1)[-1]
modname = fullname.split(".", 1)[-1]
for directory in (garden_app_dir, garden_system_dir):
moddir = join(directory, modname)
moddir = join(directory, modname, "__init__.py")
if exists(moddir):
return self._load_module(fullname, moddir)
return importlib.util.spec_from_file_location(fullname, moddir)

def _load_module(self, fullname, moddir):
mod = imp.load_module(fullname, None, moddir,
('', '', imp.PKG_DIRECTORY))
return mod
return None


# insert the garden importer as ultimate importer
Expand Down
23 changes: 23 additions & 0 deletions kivy/tests/test_garden.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import os
from tempfile import TemporaryDirectory

from unittest import mock


def test_garden_import_module():
with TemporaryDirectory() as tmpdir:
fake_garden_dir = os.path.join(tmpdir, "garden")

with mock.patch("kivy.garden.garden_system_dir", fake_garden_dir):
# Add a fake garden module to the temporary directory
dummy_flower_dir = os.path.join(
fake_garden_dir, "garden.dummyflower"
)
os.makedirs(dummy_flower_dir, exist_ok=True)

with open(os.path.join(dummy_flower_dir, "__init__.py"), "w") as f:
f.write("dummy_var = 1")

from kivy.garden.dummyflower import dummy_var

assert dummy_var == 1

0 comments on commit 64d295c

Please sign in to comment.