diff --git a/src/kaggle/api/kaggle_api_extended.py b/src/kaggle/api/kaggle_api_extended.py index e7ac2663..f3300ee9 100644 --- a/src/kaggle/api/kaggle_api_extended.py +++ b/src/kaggle/api/kaggle_api_extended.py @@ -1166,7 +1166,15 @@ def _is_help_or_version_command(self, api_command: str) -> bool: Returns: bool: True if valid """ - return api_command.endswith(("-h", "--help", "-v", "--version")) + argv = sys.argv[1:] + if not argv: + return False + # Top-level only: kaggle -v, kaggle --version, kaggle -h, kaggle --help + if len(argv) == 1 and argv[0] in ("-h", "--help", "-v", "--version"): + return True + # Subcommand help only. Do not treat trailing -v as version: many commands use + # -v as the --csv output-format alias (e.g. kaggle quota -v). + return api_command.endswith(("-h", "--help")) def read_config_environment(self, config_data: Optional[Dict[str, str]] = None) -> Dict[str, str]: """Reads config values from environment variables. diff --git a/tests/unit/test_help_version_auth.py b/tests/unit/test_help_version_auth.py new file mode 100644 index 00000000..116f6376 --- /dev/null +++ b/tests/unit/test_help_version_auth.py @@ -0,0 +1,42 @@ +# coding=utf-8 +import sys +import unittest +from unittest.mock import patch + +sys.path.insert(0, "../../src") + +from kaggle.api.kaggle_api_extended import KaggleApi + + +class TestHelpOrVersionAuth(unittest.TestCase): + """Tests for help/version detection used during authenticate().""" + + def setUp(self): + self.api = KaggleApi.__new__(KaggleApi) + + def _assert_help_or_version(self, argv, expected): + with patch.object(sys, "argv", argv): + api_command = " ".join(argv[1:]) + self.assertEqual(self.api._is_help_or_version_command(api_command), expected) + + def test_top_level_version_and_help(self): + self._assert_help_or_version(["kaggle", "-v"], True) + self._assert_help_or_version(["kaggle", "--version"], True) + self._assert_help_or_version(["kaggle", "-h"], True) + self._assert_help_or_version(["kaggle", "--help"], True) + + def test_subcommand_csv_flag_is_not_version(self): + self._assert_help_or_version(["kaggle", "quota", "-v"], False) + self._assert_help_or_version(["kaggle", "datasets", "list", "-v"], False) + + def test_subcommand_help_still_skips_auth(self): + self._assert_help_or_version(["kaggle", "quota", "-h"], True) + self._assert_help_or_version(["kaggle", "datasets", "list", "--help"], True) + + def test_quota_csv_flag_does_not_allow_logged_out(self): + with patch.object(sys, "argv", ["kaggle", "quota", "-v"]): + self.assertFalse(self.api._command_allows_logged_out("quota -v")) + + +if __name__ == "__main__": + unittest.main()