Coverage for /opt/hostedtoolcache/Python/3.10.18/x64/lib/python3.10/site-packages/starlord/cli.py: 80%

49 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-10-21 20:39 +0000

1import argparse 

2import pathlib 

3import sys 

4 

5from .star_fitter import StarFitter 

6from . import __version__ 

7from .grid_gen import GridGenerator 

8 

9if sys.version_info >= (3, 11): 

10 import tomllib 

11else: 

12 import tomli as tomllib 

13 

14 

15def main(): 

16 parser = argparse.ArgumentParser( 

17 "starlord", description="Fit stellar observations with starlord from the command line.") 

18 parser.add_argument( 

19 "input", type=pathlib.Path, nargs="?", default=None, help="A toml file to load run settings from (optional)") 

20 parser.add_argument("--dry-run", action="store_true") 

21 parser.add_argument("-v", "--verbose", action="store_true") 

22 parser.add_argument("-c", "--code", action="store_true", help="Print code upon generation.") 

23 parser.add_argument("--version", action="version", version=f"starlord {__version__}") 

24 parser.add_argument("-l", "--list-grids", action="store_true") 

25 args = parser.parse_args(args=None if sys.argv[1:] else ['--help']) 

26 

27 if args.list_grids: 

28 print("Available grids:") 

29 for g in GridGenerator.grids().values(): 

30 print(g.name.ljust(10), g.spec) 

31 return 

32 

33 # === Load Settings === 

34 # Default initial settings (keep minimal) 

35 settings = {'output': {'terminal': True, 'file': ""}, "run": {}} 

36 if args.verbose: 

37 print("Args:", args) 

38 print("Settings: ", settings) 

39 

40 if args.input is not None: 

41 if args.verbose: 

42 print(args.input) 

43 with open(args.input, 'rb') as f: 

44 settings.update(tomllib.load(f)) 

45 # Handle syntax errors in the toml file 

46 

47 # Report ignored sections 

48 

49 # Update settings with command line arguments 

50 

51 # === Setup the fitter === 

52 if "model" in settings.keys(): 

53 fitter = StarFitter(args.verbose) 

54 fitter.set_from_dict(settings['model']) 

55 else: 

56 print("No model information was specified.") 

57 return 

58 if args.code: 

59 # TODO: Set prior type based on sampler type 

60 print(fitter.generate()) 

61 if args.dry_run: 

62 fitter.summary(args.verbose) 

63 return 

64 

65 # === Run Sampler == 

66 # Use settings.sampling for config, contents depends on sampler type 

67 results = fitter.run_sampler(settings['sampling']) 

68 

69 # === Write Outputs === 

70 out: dict = {"terminal": False, "file": ""} 

71 out.update(settings['output']) 

72 if out['terminal']: 

73 print(results.summary()) 

74 if out['file'] != "": 

75 print("TODO: write results to ", out['file']) 

76 # fitter.write_results()