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

1# fmt: off 

2 

3# Note: 

4# Try to avoid module level import statements here to reduce 

5# import time during CLI execution 

6 

7 

8class CLICommand: 

9 """Print information about files or system. 

10 

11 Without arguments, show information about ASE installation 

12 and library versions of dependencies. 

13 """ 

14 

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.') 

26 

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 

37 

38 if args.files: 

39 print_file_info(args) 

40 return 

41 

42 print_info() 

43 if args.formats: 

44 print() 

45 print_formats() 

46 

47 

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 = '?' 

69 

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) 

77 

78 raise SystemExit(nfiles_not_found) 

79 

80 

81def print_info(): 

82 import platform 

83 import sys 

84 

85 from ase.dependencies import all_dependencies 

86 

87 versions = [('platform', platform.platform()), 

88 ('python-' + sys.version.split()[0], sys.executable)] 

89 

90 for name, path in versions + all_dependencies(): 

91 print(f'{name:24} {path}') 

92 

93 

94def print_formats(): 

95 from ase.io.formats import ioformats 

96 

97 print('Supported formats:') 

98 for fmtname in sorted(ioformats): 

99 fmt = ioformats[fmtname] 

100 

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) 

107 

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))) 

113 

114 print(' {} [{}]: {}'.format(fmt.name, 

115 ', '.join(moreinfo), 

116 fmt.description))