Make path parsing more idiomatic
authorBen Steffen <bds@mit.edu>
Tue, 26 Nov 2019 05:39:02 +0000 (00:39 -0500)
committerBen Steffen <bds@mit.edu>
Tue, 26 Nov 2019 05:39:02 +0000 (00:39 -0500)
scripts/invirt-getconf

index 5b3681b..d510a1f 100755 (executable)
@@ -37,47 +37,38 @@ def main():
 
     components = args.path.split('.')
 
+    conf = invirt.config.load(args.refresh)
+    for i, component in enumerate(components):
+        progress = '.'.join(components[:i])
+
+        if isinstance(conf, list):
+            try:
+                component = int(component)
+            except ValueError:
+                raise InvirtException(f'{progress}: node a list; integer path component required, '
+                                      'but got "{component}"')
+
+            try:
+                conf = conf[component]
+            except IndexError:
+                raise InvirtException(f'{progress}: index {component} out of range')
+        elif isinstance(conf, dict):
+            try:
+                conf = conf[component]
+            except KeyError:
+                raise InvirtException(f'{progress}: key "{component}" not found')
+            except IndexError:
+                raise InvirtException(f'{progress}: index {component} out of range')
         else:
-            components = []
-
-        conf = config.load(opts.refresh)
-        for i, component in enumerate(components):
-            progress = '.'.join(components[:i])
-            if type(conf) not in (dict, list):
-                raise invirt_exception(
-                        '%s: node has no children (atomic datum)' % progress)
-            if type(conf) == list:
-                try: component = int(component)
-                except: raise invirt_exception(
-                        '%s: node a list; integer path component required, '
-                        'but got "%s"' % (progress, component))
-            try: conf = conf[component]
-            except KeyError: raise invirt_exception(
-                    '%s: key "%s" not found' % (progress, component))
-            except IndexError: raise invirt_exception(
-                    '%s: index %s out of range' % (progress, component))
-
-        if opts.ls:
-            if type(conf) not in (dict, list):
-                raise invirt_exception(
-                        '%s: node has no children (atomic datum)'
-                        % '.'.join(components))
-            if type(conf) == list:
-                for i in xrange(len(conf)):
-                    print i
-            else:
-                for k in conf.iterkeys():
-                    print k
+            raise InvirtException(f'{progress}: node has no children (atomic datum)')
         else:
-            if type(conf) not in (dict, list):
-                print conf
-            else:
-                import yaml
-                yaml.dump(conf, stdout,
-                          Dumper=yaml.CSafeDumper, default_flow_style=False)
-    except invirt_exception, ex:
-        print >> stderr, ex
-        return 1
+            raise InvirtException(f'{".".join(components)}: node has no children (atomic datum)')
+    else:
+        if isinstance(conf, (dict, list)):
+            print(conf)
+        else:
+            yaml.dump(conf, sys.stdout, Dumper=yaml.CSafeDumper, default_flow_style=False)
+
 
 if __name__ == '__main__':
     exit(main(argv))