diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 00000000..8faa529d --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,48 @@ +# Configuration + +`gcalcli` supports configuration via a `config.toml` file, typically located at `~/.config/gcalcli/config.toml` (or `$XDG_CONFIG_HOME/gcalcli/config.toml`). + +## Structure + +The configuration is divided into sections: + +### `[auth]` + +Settings for authentication (Client ID). + +### `[calendars]` + +Settings for default and ignored calendars. + +### `[output]` + +Settings for output formatting (week start). + +### `[default]` (New) + +Set default values for global command-line flags. + +```toml +[default] +interactive = false # Disable interactive prompts (simulates --yes) +color = true # Enable/Disable color +conky = false # Conky compatible output +``` + +## Example `config.toml` + +```toml +[auth] +client-id = "your-client-id.apps.googleusercontent.com" + +[calendars] +default-calendars = ["Work", "Personal"] +ignore-calendars = ["Holidays"] + +[output] +week-start = "monday" + +[default] +interactive = true +color = true +``` diff --git a/gcalcli/argparsers.py b/gcalcli/argparsers.py index 023a338e..d4561bb0 100644 --- a/gcalcli/argparsers.py +++ b/gcalcli/argparsers.py @@ -502,7 +502,7 @@ def get_argument_parser(): 'interactively.', ) delete.add_argument( - '--iamaexpert', action='store_true', help='Probably not' + '--iamaexpert', action='store_true', help='Legacy alias for --yes' ) sub.add_parser( diff --git a/gcalcli/cli.py b/gcalcli/cli.py index 5f7ad1da..a9683d76 100755 --- a/gcalcli/cli.py +++ b/gcalcli/cli.py @@ -193,17 +193,16 @@ def main(): opts_from_config = config.Config() namespace_from_config = opts_from_config.to_argparse_namespace() - # Pull week_start aside and set it manually after parse_known_args. - # TODO: Figure out why week_start from opts_from_config getting through. - week_start = namespace_from_config.week_start - namespace_from_config.week_start = None + + # Apply config values as defaults for the parser. + # This allows config to override program defaults, while still letting + # explicit CLI arguments override config. + parser.set_defaults(**vars(namespace_from_config)) + if parsed_args.includeRc: argv = fromfile_args + argv - (parsed_args, unparsed) = parser.parse_known_args( - argv, namespace=namespace_from_config - ) - if parsed_args.week_start is None: - parsed_args.week_start = week_start + (parsed_args, unparsed) = parser.parse_known_args(argv) + if parsed_args.config_folder: parsed_args.config_folder = parsed_args.config_folder.expanduser() diff --git a/gcalcli/config.py b/gcalcli/config.py index 6181cb1e..68a5dcc3 100644 --- a/gcalcli/config.py +++ b/gcalcli/config.py @@ -70,6 +70,30 @@ class OutputSection(BaseModel): ) +class DefaultSection(BaseModel): + model_config = ConfigDict( + title='Default Global Options' + ) + + interactive: bool = Field( + alias='interactive', + title='Enable interactive mode (default: true)', + default=True + ) + + color: bool = Field( + alias='color', + title='Enable color output (default: true)', + default=True + ) + + conky: bool = Field( + alias='conky', + title='Enable conky color codes', + default=False + ) + + class Config(BaseModel): """User configuration for gcalcli command-line tool. @@ -84,6 +108,7 @@ class Config(BaseModel): auth: AuthSection = Field(default_factory=AuthSection) calendars: CalendarsSection = Field(default_factory=CalendarsSection) output: OutputSection = Field(default_factory=OutputSection) + default: DefaultSection = Field(default_factory=DefaultSection) @classmethod def from_toml(cls, config_file): @@ -98,6 +123,8 @@ def to_argparse_namespace(self) -> argparse.Namespace: kwargs.update(vars(self.calendars)) if self.output: kwargs.update(vars(self.output)) + if self.default: + kwargs.update(vars(self.default)) return argparse.Namespace(**kwargs) @classmethod