From f98dc1762c23851c9bbd1d5a4d7425cf67695e6d Mon Sep 17 00:00:00 2001 From: Ian Duffy Date: Sat, 22 Aug 2026 00:02:14 +0100 Subject: [PATCH 1/2] perf(no-ticket): defer the rich, urllib3 and semver imports Import rich in rich_print_table, semver in the version parsers, and move the urllib3 insecure-request warning filter to core/session.py, which every insecure request flows through. Co-Authored-By: Claude Fable 5 --- cloudsmith_cli/__init__.py | 2 -- cloudsmith_cli/cli/tests/test_startup_imports.py | 10 +++++++++- cloudsmith_cli/cli/utils.py | 7 +++++-- cloudsmith_cli/core/api/version.py | 5 +++-- cloudsmith_cli/core/session.py | 6 ++++++ cloudsmith_cli/core/version.py | 5 +++-- 6 files changed, 26 insertions(+), 9 deletions(-) diff --git a/cloudsmith_cli/__init__.py b/cloudsmith_cli/__init__.py index f3664433..101b150c 100644 --- a/cloudsmith_cli/__init__.py +++ b/cloudsmith_cli/__init__.py @@ -3,8 +3,6 @@ import warnings import click -import urllib3 click.disable_unicode_literals_warning = True -urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) warnings.filterwarnings("ignore", category=ResourceWarning) diff --git a/cloudsmith_cli/cli/tests/test_startup_imports.py b/cloudsmith_cli/cli/tests/test_startup_imports.py index 3eb1dcaf..5068d76f 100644 --- a/cloudsmith_cli/cli/tests/test_startup_imports.py +++ b/cloudsmith_cli/cli/tests/test_startup_imports.py @@ -9,7 +9,15 @@ import subprocess import sys -HEAVY_PREFIXES = ("mcp", "httpx", "cloudsmith_api", "requests") +HEAVY_PREFIXES = ( + "mcp", + "httpx", + "cloudsmith_api", + "requests", + "rich", + "urllib3", + "semver", +) def modules_loaded_by_import(module_name="cloudsmith_cli.cli.commands.main"): diff --git a/cloudsmith_cli/cli/utils.py b/cloudsmith_cli/cli/utils.py index be17fef6..775a20fe 100644 --- a/cloudsmith_cli/cli/utils.py +++ b/cloudsmith_cli/cli/utils.py @@ -7,8 +7,6 @@ import click from click_spinner import spinner -from rich.console import Console -from rich.table import Table from ..core.api.version import get_version as get_api_version from ..core.version import get_version as get_cli_version @@ -74,6 +72,11 @@ def pretty_print_row(styled, plain): def rich_print_table(headers, rows, title=None, show_lines=False): """Rich table from headers and rows.""" + # rich costs ~35ms to import. Import it here so that only the + # commands that render a rich table pay that cost. + from rich.console import Console + from rich.table import Table + console = Console() table = Table(title=title, show_lines=show_lines) diff --git a/cloudsmith_cli/core/api/version.py b/cloudsmith_cli/core/api/version.py index 53392ae6..4e0e731b 100644 --- a/cloudsmith_cli/core/api/version.py +++ b/cloudsmith_cli/core/api/version.py @@ -2,8 +2,6 @@ import importlib.metadata -import semver - def get_version(): """Get the raw/unparsed version of the API as a string.""" @@ -12,4 +10,7 @@ def get_version(): def get_version_info(): """Get the API version as VersionInfo object.""" + # semver costs ~6ms to import and only version comparisons need it. + import semver + return semver.parse_version_info(get_version()) diff --git a/cloudsmith_cli/core/session.py b/cloudsmith_cli/core/session.py index 750a032f..472a7818 100644 --- a/cloudsmith_cli/core/session.py +++ b/cloudsmith_cli/core/session.py @@ -4,9 +4,15 @@ import time import requests +import urllib3 from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry +# Every insecure request (-S/--without-api-ssl-verify) flows through a +# session from this module, so the warning filter applies here instead of +# the package __init__, which must stay free of the urllib3 import. +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + class RetryWithCallback(Retry): """A urllib3 Retry with a callback on retries.""" diff --git a/cloudsmith_cli/core/version.py b/cloudsmith_cli/core/version.py index ef2fe251..2c6a7f3e 100644 --- a/cloudsmith_cli/core/version.py +++ b/cloudsmith_cli/core/version.py @@ -1,7 +1,5 @@ """Core version utilities.""" -import semver - from . import utils @@ -17,4 +15,7 @@ def get_version_info(): def parse_version(version): """Get a version string as a VersionInfo object.""" + # semver costs ~6ms to import and only version comparisons need it. + import semver + return semver.parse_version_info(version) From 2460f0e3c70276e44a995433152482e147caac4f Mon Sep 17 00:00:00 2001 From: Ian Duffy Date: Sat, 22 Aug 2026 00:04:52 +0100 Subject: [PATCH 2/2] chore(no-ticket): drop the import-cost comments Co-Authored-By: Claude Fable 5 --- cloudsmith_cli/cli/utils.py | 2 -- cloudsmith_cli/core/api/version.py | 1 - cloudsmith_cli/core/session.py | 3 --- cloudsmith_cli/core/version.py | 1 - 4 files changed, 7 deletions(-) diff --git a/cloudsmith_cli/cli/utils.py b/cloudsmith_cli/cli/utils.py index 775a20fe..7fc749f6 100644 --- a/cloudsmith_cli/cli/utils.py +++ b/cloudsmith_cli/cli/utils.py @@ -72,8 +72,6 @@ def pretty_print_row(styled, plain): def rich_print_table(headers, rows, title=None, show_lines=False): """Rich table from headers and rows.""" - # rich costs ~35ms to import. Import it here so that only the - # commands that render a rich table pay that cost. from rich.console import Console from rich.table import Table diff --git a/cloudsmith_cli/core/api/version.py b/cloudsmith_cli/core/api/version.py index 4e0e731b..d6ff3ead 100644 --- a/cloudsmith_cli/core/api/version.py +++ b/cloudsmith_cli/core/api/version.py @@ -10,7 +10,6 @@ def get_version(): def get_version_info(): """Get the API version as VersionInfo object.""" - # semver costs ~6ms to import and only version comparisons need it. import semver return semver.parse_version_info(get_version()) diff --git a/cloudsmith_cli/core/session.py b/cloudsmith_cli/core/session.py index 472a7818..10a55df3 100644 --- a/cloudsmith_cli/core/session.py +++ b/cloudsmith_cli/core/session.py @@ -8,9 +8,6 @@ from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry -# Every insecure request (-S/--without-api-ssl-verify) flows through a -# session from this module, so the warning filter applies here instead of -# the package __init__, which must stay free of the urllib3 import. urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) diff --git a/cloudsmith_cli/core/version.py b/cloudsmith_cli/core/version.py index 2c6a7f3e..31d9377c 100644 --- a/cloudsmith_cli/core/version.py +++ b/cloudsmith_cli/core/version.py @@ -15,7 +15,6 @@ def get_version_info(): def parse_version(version): """Get a version string as a VersionInfo object.""" - # semver costs ~6ms to import and only version comparisons need it. import semver return semver.parse_version_info(version)