From 0b351fc414cbf11c2dfe7618992d47fd6cfd006d Mon Sep 17 00:00:00 2001 From: Emmet Stanevich Date: Wed, 31 Dec 2025 01:24:28 +0000 Subject: [PATCH 1/4] Loostened upper bound on Invoke Invoke 2.1.0 is the earliest version that uses `importlib` instead of `imp`, and by extension, is the first version to support python 3.12+ --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9d299b8b..1b7dc645 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ pydantic==1.10.7 typer==0.7.0 -invoke==2.0.0 +invoke~=2.1 natsort==8.3.1 sentry-sdk==1.24.0 \ No newline at end of file From b4fdfbb5901117236b3d80c5e952a8fc831b87e0 Mon Sep 17 00:00:00 2001 From: Emmet Stanevich Date: Wed, 31 Dec 2025 01:26:08 +0000 Subject: [PATCH 2/4] Pinned Click version Click version `8.0.0` includes a backwards-incompatible change that prevents nanolayer from working, so I'm pinning it to a version that should still work. --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 1b7dc645..fad47e0a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ pydantic==1.10.7 typer==0.7.0 +click~=7.1 invoke~=2.1 natsort==8.3.1 sentry-sdk==1.24.0 \ No newline at end of file From 7e5b8b57a170f8efb3832d33dc226a49ebe3dc43 Mon Sep 17 00:00:00 2001 From: Emmet Stanevich Date: Wed, 31 Dec 2025 01:28:13 +0000 Subject: [PATCH 3/4] Replaced use of distutils with shutil `distutils` was removed in Python 3.12. The use of `distutils.spawn.find_executable()` can be replaces with `shutil.which()` for the same result. --- nanolayer/installers/gh_release/resolvers/release_resolver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nanolayer/installers/gh_release/resolvers/release_resolver.py b/nanolayer/installers/gh_release/resolvers/release_resolver.py index 1a59ce86..eb535de8 100644 --- a/nanolayer/installers/gh_release/resolvers/release_resolver.py +++ b/nanolayer/installers/gh_release/resolvers/release_resolver.py @@ -3,7 +3,7 @@ import re import urllib from typing import Any, Dict, List, Optional -import distutils.spawn +import shutil import invoke from natsort import natsorted @@ -84,7 +84,7 @@ def get_latest_release_tag( @classmethod def _git_exists(cls) -> bool: - return distutils.spawn.find_executable("git") is not None + return shutil.which("git") is not None @classmethod def resolve( From fe222b4c7d2c15f2f6a1a1207c1b75b5a6ac2cf0 Mon Sep 17 00:00:00 2001 From: Emmet Stanevich Date: Fri, 2 Jan 2026 15:38:02 -0500 Subject: [PATCH 4/4] Relaxed pydantic constraint Pydantic version 1.10.7 is incompatible with python 3.14. Support for python 3.14 is available in version 1.10.25, so relaxing the upper bound should allow nanolayer to continue running on python 3.14. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fad47e0a..1e735473 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -pydantic==1.10.7 +pydantic~=1.10.7 typer==0.7.0 click~=7.1 invoke~=2.1