Coverage for /builds/ase/ase/ase/cli/info.py: 86.30%
73 statements
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
1# fmt: off
3# Note:
4# Try to avoid module level import statements here to reduce
5# import time during CLI execution
8class CLICommand:
9 """Print information about files or system.
11 Without arguments, show information about ASE installation
12 and library versions of dependencies.
13 """
15 @staticmethod
16 def add_arguments(parser):
17 parser.add_argument('--files', nargs='*', metavar='PATH',
18 help='Print information about specified files.')
19 parser.add_argument('-v', '--verbose', action='store_true',
20 help='Show additional information about files.')
21 parser.add_argument('--formats', action='store_true',
22 help='List file formats known to ASE.')
23 parser.add_argument('--calculators', nargs='*', metavar='NAME',
24 help='List all or specified calculators known to '
25 'ASE and their configuration.')
27 @staticmethod
28 def run(args):
29 if args.calculators is not None:
30 from ase.codes import codes, list_codes
31 if args.calculators:
32 names = args.calculators
33 else:
34 names = [*codes]
35 list_codes(names)
36 return
38 if args.files:
39 print_file_info(args)
40 return
42 print_info()
43 if args.formats:
44 print()
45 print_formats()
48def print_file_info(args):
49 from ase.io.bundletrajectory import print_bundletrajectory_info
50 from ase.io.formats import UnknownFileTypeError, filetype, ioformats
51 from ase.io.ulm import print_ulm_info
52 n = max(len(filename) for filename in args.files) + 2
53 nfiles_not_found = 0
54 for filename in args.files:
55 try:
56 format = filetype(filename)
57 except FileNotFoundError:
58 format = '?'
59 description = 'No such file'
60 nfiles_not_found += 1
61 except UnknownFileTypeError:
62 format = '?'
63 description = '?'
64 else:
65 if format in ioformats:
66 description = ioformats[format].description
67 else:
68 description = '?'
70 print('{:{}}{} ({})'.format(filename + ':', n,
71 description, format))
72 if args.verbose:
73 if format == 'traj':
74 print_ulm_info(filename)
75 elif format == 'bundletrajectory':
76 print_bundletrajectory_info(filename)
78 raise SystemExit(nfiles_not_found)
81def print_info():
82 import platform
83 import sys
85 from ase.dependencies import all_dependencies
87 versions = [('platform', platform.platform()),
88 ('python-' + sys.version.split()[0], sys.executable)]
90 for name, path in versions + all_dependencies():
91 print(f'{name:24} {path}')
94def print_formats():
95 from ase.io.formats import ioformats
97 print('Supported formats:')
98 for fmtname in sorted(ioformats):
99 fmt = ioformats[fmtname]
101 infos = [fmt.modes, 'single' if fmt.single else 'multi']
102 if fmt.isbinary:
103 infos.append('binary')
104 if fmt.encoding is not None:
105 infos.append(fmt.encoding)
106 infostring = '/'.join(infos)
108 moreinfo = [infostring]
109 if fmt.extensions:
110 moreinfo.append('ext={}'.format('|'.join(fmt.extensions)))
111 if fmt.globs:
112 moreinfo.append('glob={}'.format('|'.join(fmt.globs)))
114 print(' {} [{}]: {}'.format(fmt.name,
115 ', '.join(moreinfo),
116 fmt.description))