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)