Coverage for /builds/debichem-team/python-ase/ase/cli/info.py: 86.30%

73 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2025-03-06 04:00 +0000

1# Note: 

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

3# import time during CLI execution 

4 

5 

6class CLICommand: 

7 """Print information about files or system. 

8 

9 Without arguments, show information about ASE installation 

10 and library versions of dependencies. 

11 """ 

12 

13 @staticmethod 

14 def add_arguments(parser): 

15 parser.add_argument('--files', nargs='*', metavar='PATH', 

16 help='Print information about specified files.') 

17 parser.add_argument('-v', '--verbose', action='store_true', 

18 help='Show additional information about files.') 

19 parser.add_argument('--formats', action='store_true', 

20 help='List file formats known to ASE.') 

21 parser.add_argument('--calculators', nargs='*', metavar='NAME', 

22 help='List all or specified calculators known to ' 

23 'ASE and their configuration.') 

24 

25 @staticmethod 

26 def run(args): 

27 if args.calculators is not None: 

28 from ase.codes import codes, list_codes 

29 if args.calculators: 

30 names = args.calculators 

31 else: 

32 names = [*codes] 

33 list_codes(names) 

34 return 

35 

36 if args.files: 

37 print_file_info(args) 

38 return 

39 

40 print_info() 

41 if args.formats: 

42 print() 

43 print_formats() 

44 

45 

46def print_file_info(args): 

47 from ase.io.bundletrajectory import print_bundletrajectory_info 

48 from ase.io.formats import UnknownFileTypeError, filetype, ioformats 

49 from ase.io.ulm import print_ulm_info 

50 n = max(len(filename) for filename in args.files) + 2 

51 nfiles_not_found = 0 

52 for filename in args.files: 

53 try: 

54 format = filetype(filename) 

55 except FileNotFoundError: 

56 format = '?' 

57 description = 'No such file' 

58 nfiles_not_found += 1 

59 except UnknownFileTypeError: 

60 format = '?' 

61 description = '?' 

62 else: 

63 if format in ioformats: 

64 description = ioformats[format].description 

65 else: 

66 description = '?' 

67 

68 print('{:{}}{} ({})'.format(filename + ':', n, 

69 description, format)) 

70 if args.verbose: 

71 if format == 'traj': 

72 print_ulm_info(filename) 

73 elif format == 'bundletrajectory': 

74 print_bundletrajectory_info(filename) 

75 

76 raise SystemExit(nfiles_not_found) 

77 

78 

79def print_info(): 

80 import platform 

81 import sys 

82 

83 from ase.dependencies import all_dependencies 

84 

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

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

87 

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

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

90 

91 

92def print_formats(): 

93 from ase.io.formats import ioformats 

94 

95 print('Supported formats:') 

96 for fmtname in sorted(ioformats): 

97 fmt = ioformats[fmtname] 

98 

99 infos = [fmt.modes, 'single' if fmt.single else 'multi'] 

100 if fmt.isbinary: 

101 infos.append('binary') 

102 if fmt.encoding is not None: 

103 infos.append(fmt.encoding) 

104 infostring = '/'.join(infos) 

105 

106 moreinfo = [infostring] 

107 if fmt.extensions: 

108 moreinfo.append('ext={}'.format('|'.join(fmt.extensions))) 

109 if fmt.globs: 

110 moreinfo.append('glob={}'.format('|'.join(fmt.globs))) 

111 

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

113 ', '.join(moreinfo), 

114 fmt.description))