diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index a220d57b..76c86d5d 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -30,7 +30,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 diff --git a/source/ftrack_api/cache.py b/source/ftrack_api/cache.py index 57038b5b..ed74d68b 100644 --- a/source/ftrack_api/cache.py +++ b/source/ftrack_api/cache.py @@ -15,19 +15,15 @@ ''' -from future import standard_library -standard_library.install_aliases() from builtins import str from six import string_types from builtins import object -import collections from six.moves import collections_abc import functools import abc import copy import inspect import re -import six try: # Python 2.x diff --git a/source/ftrack_api/event/hub.py b/source/ftrack_api/event/hub.py index f599b873..fddca01c 100644 --- a/source/ftrack_api/event/hub.py +++ b/source/ftrack_api/event/hub.py @@ -3,8 +3,6 @@ from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() from builtins import str from builtins import range from builtins import object diff --git a/source/ftrack_api/plugin.py b/source/ftrack_api/plugin.py index d767e6b7..918c28ef 100644 --- a/source/ftrack_api/plugin.py +++ b/source/ftrack_api/plugin.py @@ -7,7 +7,6 @@ import collections import os import uuid -import imp import traceback try: @@ -41,6 +40,26 @@ def getfullargspec(func): annotations={} ) +try: + from imp import load_source + +except ImportError: + # The imp module is deprecated in version 3.12. Use importlib instead. + import importlib.util + import importlib.machinery + + def load_source(modname, filename): + # https://docs.python.org/3/whatsnew/3.12.html#imp + + loader = importlib.machinery.SourceFileLoader(modname, filename) + module = importlib.util.module_from_spec( + importlib.util.spec_from_file_location(modname, filename, loader=loader) + ) + + loader.exec_module(module) + + return module + def discover(paths, positional_arguments=None, keyword_arguments=None): '''Find and load plugins in search *paths*. @@ -77,7 +96,7 @@ def discover(paths, positional_arguments=None, keyword_arguments=None): unique_name = uuid.uuid4().hex try: - module = imp.load_source(unique_name, module_path) + module = load_source(unique_name, module_path) except Exception as error: logger.warning( 'Failed to load plugin from "{0}": {1}'