Skip to content

Commit 4e64b22

Browse files
Improve error handling of missing configuration
1 parent 4787f82 commit 4e64b22

File tree

5 files changed

+33
-6
lines changed

5 files changed

+33
-6
lines changed

cloudinary_cli/cli.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
import cloudinary_cli.modules
1111
import cloudinary_cli.samples
1212
from cloudinary_cli.defaults import logger
13-
from cloudinary_cli.utils.config_utils import initialize, load_config, refresh_cloudinary_config
14-
from cloudinary_cli.utils.utils import log_exception
13+
from cloudinary_cli.utils.config_utils import initialize, load_config, refresh_cloudinary_config, \
14+
is_valid_cloudinary_config
15+
from cloudinary_cli.utils.utils import log_exception, ConfigurationError
1516

1617
CONTEXT_SETTINGS = dict(max_content_width=shutil.get_terminal_size()[0], terminal_width=shutil.get_terminal_size()[0])
1718

@@ -34,7 +35,7 @@ def cli(config, config_saved):
3435

3536
refresh_cloudinary_config(config[config_saved])
3637

37-
if cloudinary.config().cloud_name is None:
38+
if not is_valid_cloudinary_config():
3839
logger.warning("No Cloudinary configuration found.")
3940

4041
return 0
@@ -57,8 +58,15 @@ def main():
5758
initialize()
5859
try:
5960
exit_status = cli()
61+
except ConfigurationError as e:
62+
log_exception(e)
63+
exit_status = 1
6064
except Exception as e:
61-
log_exception(e, "Command execution failed")
65+
# Improve configuration error handling
66+
if "Must supply cloud_name" in str(e):
67+
log_exception("No Cloudinary configuration found.")
68+
else:
69+
log_exception(e, "Command execution failed")
6270
exit_status = 1
6371

6472
return exit_status

cloudinary_cli/utils/api_utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from os import path, makedirs
33
from webbrowser import open as open_url
44

5+
import cloudinary
56
import requests
67
from click import style
78
from cloudinary import Search, uploader
@@ -11,7 +12,8 @@
1112
from cloudinary_cli.utils.file_utils import normalize_file_extension, posix_rel_path
1213
from cloudinary_cli.utils.json_utils import print_json, write_json_to_file
1314
from cloudinary_cli.utils.utils import print_help, log_exception, confirm_action, \
14-
get_command_params, merge_responses, normalize_list_params
15+
get_command_params, merge_responses, normalize_list_params, ConfigurationError
16+
from cloudinary_cli.utils.config_utils import is_valid_cloudinary_config
1517

1618
PAGINATION_MAX_RESULTS = 500
1719

@@ -164,6 +166,9 @@ def handle_api_command(
164166
api_instance,
165167
api_name)
166168

169+
if not is_valid_cloudinary_config():
170+
raise ConfigurationError("No Cloudinary configuration found.")
171+
167172
res = call_api(func, args, kwargs)
168173

169174
if auto_paginate:

cloudinary_cli/utils/config_utils.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,13 @@ def migrate_old_config():
7777
os.remove(OLD_CLOUDINARY_CLI_CONFIG_FILE)
7878

7979

80+
def is_valid_cloudinary_config():
81+
return None not in [cloudinary.config().cloud_name, cloudinary.config().api_key, cloudinary.config().api_secret]
82+
83+
8084
def initialize():
8185
migrate_old_config()
8286

8387

8488
def _verify_file_path(file):
8589
os.makedirs(os.path.dirname(file), exist_ok=True)
86-

cloudinary_cli/utils/utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
BLOCK_SIZE = 65536
2121

2222

23+
class ConfigurationError(Exception):
24+
pass
25+
26+
2327
def etag(fi):
2428
file_hash = md5()
2529
with open(fi, 'rb') as f:

test/test_cli_config.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class TestCLIConfig(unittest.TestCase):
2222
runner = CliRunner()
2323
TEST_CLOUD_NAME = 'test_cloud'
2424
TEST_CLOUDINARY_URL = 'cloudinary://key:secret@' + TEST_CLOUD_NAME
25+
INVALID_CLOUDINARY_URL = 'cloudinary://key:secret@'
2526

2627
@classmethod
2728
def tearDownClass(cls) -> None:
@@ -46,6 +47,12 @@ def test_cli_config_invalid_config(self):
4647
self.assertEqual(1, result.exit_code)
4748
self.assertIn('Invalid CLOUDINARY_URL scheme', str(result.exc_info[1]))
4849

50+
def test_cli_config_invalid_config_cloud_name(self):
51+
result = self.runner.invoke(cli, ['--config', self.INVALID_CLOUDINARY_URL, 'ping'])
52+
53+
self.assertEqual(1, result.exit_code)
54+
self.assertIn('No Cloudinary configuration found.', str(result.exc_info[1]))
55+
4956
def test_cli_show_config(self):
5057
result = self.runner.invoke(cli, ['--config', self.TEST_CLOUDINARY_URL, 'config'])
5158

0 commit comments

Comments
 (0)