From 1ba4e41928138604e4db292c652748f39db2063e Mon Sep 17 00:00:00 2001 From: TalLevAmi Date: Sat, 26 Sep 2026 15:36:11 +0000 Subject: [PATCH] Show a one-line error for an invalid `CLOUDINARY_URL` With `CLOUDINARY_URL=garbage`, every command printed a Python traceback. The SDK reads the variable when it is imported, before `main()` can handle errors. Catch the `ValueError` from `import cloudinary` and exit with one line that tells the user to fix or unset the variable. Co-Authored-By: Claude Opus 5.5 --- cloudinary_cli/__init__.py | 8 +++++++- test/test_cli.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/cloudinary_cli/__init__.py b/cloudinary_cli/__init__.py index 3d1dcb0..d73c118 100644 --- a/cloudinary_cli/__init__.py +++ b/cloudinary_cli/__init__.py @@ -1,5 +1,11 @@ +import sys + from cloudinary_cli.version import __version__ -import cloudinary +try: + import cloudinary +except ValueError as e: + # The SDK reads CLOUDINARY_URL on import, before the CLI can handle errors. + sys.exit(f"error: {e}. Fix or unset the CLOUDINARY_URL environment variable.") cloudinary.USER_PLATFORM = f"CloudinaryCLI/{__version__}" diff --git a/test/test_cli.py b/test/test_cli.py index f833cc3..43cef5a 100644 --- a/test/test_cli.py +++ b/test/test_cli.py @@ -1,3 +1,6 @@ +import os +import subprocess +import sys import unittest from click.testing import CliRunner @@ -47,3 +50,12 @@ def test_cli_version(self): self.assertIn('Cloudinary CLI', result.output) self.assertIn('Cloudinary SDK', result.output) self.assertIn('Python', result.output) + + def test_invalid_cloudinary_url_env(self): + env = {**os.environ, "CLOUDINARY_URL": "garbage"} + result = subprocess.run([sys.executable, "-m", "cloudinary_cli.cli", "admin", "ping"], + env=env, capture_output=True, text=True) + + self.assertEqual(1, result.returncode) + self.assertIn("Fix or unset the CLOUDINARY_URL environment variable", result.stderr) + self.assertNotIn("Traceback", result.stderr)