From e7cac440a90bde7f8a1ba57963d65a9ae57af71f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20=C3=96zdemir?= Date: Mon, 13 Jul 2026 02:57:55 -0700 Subject: [PATCH] Support case-insensitive CLI member access Fixes google/python-fire#43 Co-authored-by: Cursor --- fire/core.py | 7 +++++++ fire/fire_test.py | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/fire/core.py b/fire/core.py index 8e23e76b..437eee91 100644 --- a/fire/core.py +++ b/fire/core.py @@ -642,6 +642,13 @@ def _GetMember(component, args): arg.replace('-', '_'), # treat '-' as '_'. ] + # Case-insensitive member access (issue #43). + public_members = [m for m in members if not m.startswith('__')] + lower_to_member = {m.lower(): m for m in public_members} + if arg.lower() in lower_to_member: + member_name = lower_to_member[arg.lower()] + return getattr(component, member_name), [arg], args[1:] + for arg_name in arg_names: if arg_name in members: return getattr(component, arg_name), [arg], args[1:] diff --git a/fire/fire_test.py b/fire/fire_test.py index 99b4a7c6..4b25c815 100644 --- a/fire/fire_test.py +++ b/fire/fire_test.py @@ -712,6 +712,13 @@ def testHelpKwargsDecorator(self): with self.assertRaisesFireExit(0): fire.Fire(tc.decorated_method, command=['--help']) + def testFireCaseInsensitiveMember(self): + class CaseExample(object): + def Alpha(self): + return 'path 1' + + self.assertEqual(fire.Fire(CaseExample, command=['alpha']), 'path 1') + def testFireAsyncio(self): self.assertEqual(fire.Fire(tc.py3.WithAsyncio, command=['double', '--count', '10']), 20)