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
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-21 20:39 +0000
1import argparse
2import pathlib
3import sys
5from .star_fitter import StarFitter
6from . import __version__
7from .grid_gen import GridGenerator
9if sys.version_info >= (3, 11):
10 import tomllib
11else:
12 import tomli as tomllib
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'])
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
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)
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
47 # Report ignored sections
49 # Update settings with command line arguments
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
65 # === Run Sampler ==
66 # Use settings.sampling for config, contents depends on sampler type
67 results = fitter.run_sampler(settings['sampling'])
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()