diff --git a/src/primaite/cli.py b/src/primaite/cli.py index ca493493..b65a6c97 100644 --- a/src/primaite/cli.py +++ b/src/primaite/cli.py @@ -11,7 +11,7 @@ from typing_extensions import Annotated from primaite import PRIMAITE_PATHS -app = typer.Typer() +app = typer.Typer(no_args_is_help=True) @app.command() @@ -114,3 +114,47 @@ def setup(overwrite_existing: bool = True) -> None: reset_example_configs.run(overwrite_existing=True) _LOGGER.info("PrimAITE setup complete!") + + +@app.command() +def mode( + dev: Annotated[bool, typer.Option("--dev", help="Activates PrimAITE developer mode")] = None, + prod: Annotated[bool, typer.Option("--prod", help="Activates PrimAITE production mode")] = None, +) -> None: + """ + Switch PrimAITE between developer mode and production mode. + + By default, PrimAITE will be in production mode. + + To view the current mode, use: primaite mode + + To set to development mode, use: primaite mode --dev + + To return to production mode, use: primaite mode --prod + """ + if PRIMAITE_PATHS.app_config_file_path.exists(): + with open(PRIMAITE_PATHS.app_config_file_path, "r") as file: + primaite_config = yaml.safe_load(file) + if dev and prod: + print("Unable to activate developer and production modes concurrently.") + return + + if (dev is None) and (prod is None): + is_dev_mode = primaite_config["developer_mode"] + + if is_dev_mode: + print("PrimAITE is running in developer mode.") + else: + print("PrimAITE is running in production mode.") + if dev: + # activate dev mode + primaite_config["developer_mode"] = True + with open(PRIMAITE_PATHS.app_config_file_path, "w") as file: + yaml.dump(primaite_config, file) + print("PrimAITE is running in developer mode.") + if prod: + # activate prod mode + primaite_config["developer_mode"] = False + with open(PRIMAITE_PATHS.app_config_file_path, "w") as file: + yaml.dump(primaite_config, file) + print("PrimAITE is running in production mode.") diff --git a/src/primaite/session/io.py b/src/primaite/session/io.py index 6aff6f9f..22001fd2 100644 --- a/src/primaite/session/io.py +++ b/src/primaite/session/io.py @@ -7,6 +7,7 @@ from pydantic import BaseModel, ConfigDict from primaite import getLogger, PRIMAITE_PATHS from primaite.simulator import LogLevel, SIM_OUTPUT +from src.primaite.utils.primaite_config_utils import is_dev_mode _LOGGER = getLogger(__name__) @@ -60,7 +61,14 @@ class PrimaiteIO: timestamp = datetime.now() date_str = timestamp.strftime("%Y-%m-%d") time_str = timestamp.strftime("%H-%M-%S") - session_path = PRIMAITE_PATHS.user_sessions_path / date_str / time_str + + # check if running in dev mode + if is_dev_mode(): + # if dev mode, simulation output will be the current working directory + session_path = Path.cwd() / "simulation_output" / date_str / time_str + else: + session_path = PRIMAITE_PATHS.user_sessions_path / date_str / time_str + session_path.mkdir(exist_ok=True, parents=True) return session_path diff --git a/src/primaite/setup/_package_data/primaite_config.yaml b/src/primaite/setup/_package_data/primaite_config.yaml index b9e0d73c..f80f4d8a 100644 --- a/src/primaite/setup/_package_data/primaite_config.yaml +++ b/src/primaite/setup/_package_data/primaite_config.yaml @@ -1,5 +1,7 @@ # The main PrimAITE application config file +developer_mode: False # false by default + # Logging logging: log_level: INFO @@ -9,14 +11,3 @@ logging: WARNING: '%(asctime)s::%(levelname)s::%(name)s::%(lineno)s::%(message)s' ERROR: '%(asctime)s::%(levelname)s::%(name)s::%(lineno)s::%(message)s' CRITICAL: '%(asctime)s::%(levelname)s::%(name)s::%(lineno)s::%(message)s' - -# Session -session: - outputs: - plots: - size: - auto_size: false - width: 1500 - height: 900 - template: plotly_white - range_slider: false diff --git a/src/primaite/utils/primaite_config_utils.py b/src/primaite/utils/primaite_config_utils.py new file mode 100644 index 00000000..70a7e4ba --- /dev/null +++ b/src/primaite/utils/primaite_config_utils.py @@ -0,0 +1,11 @@ +import yaml + +from primaite import PRIMAITE_PATHS + + +def is_dev_mode() -> bool: + """Returns True if PrimAITE is currently running in developer mode.""" + if PRIMAITE_PATHS.app_config_file_path.exists(): + with open(PRIMAITE_PATHS.app_config_file_path, "r") as file: + primaite_config = yaml.safe_load(file) + return primaite_config["developer_mode"]