Skip to content

feat: Add support for reading command-line options from dotfiles (#191)#580

Open
adminlip wants to merge 1 commit into
zio:masterfrom
adminlip:feat/file-options-191
Open

feat: Add support for reading command-line options from dotfiles (#191)#580
adminlip wants to merge 1 commit into
zio:masterfrom
adminlip:feat/file-options-191

Conversation

@adminlip
Copy link
Copy Markdown

Summary

Implements #191: CLI applications can now read default option values from .<command> dotfiles in the current working directory, its parent directories, and the user home directory.

Design

  • FileOptions service trait with Live (JVM/Native) and Noop (JS/tests) implementations
  • Priority order: closer files win (cwd > parents > home), CLI args always override file defaults
  • OrElse root guard: when the top-level command is (a | b), file-options lookup is silently skipped (no unique name to anchor on)
  • Platform shims: FileOptionsPlatformSpecific provides default = Live on JVM/Native, default = Noop on Scala.js

Changes

New files

  • FileOptions.scala — service trait + Live/Noop implementations
  • FileOptionsPlatformSpecific.scala (js/jvm/native) — platform-specific default value
  • FileOptionsOverrideSpec.scala — tests for priority/override semantics
  • LiveFileOptionsSpecShared.scala — filesystem tests using TestSystem

Modified files

  • CliApp.scala — new runWithFileArgs/runWithoutFileArgs methods; run now uses platform default
  • Command.scalaparse methods accept fromFiles: List[FileOptions.OptionsFromFile] parameter
  • Options.scalavalidate merges file-derived options before CLI args; new mergeFileOptions/mergeFileAndInputOptions helpers

How it works

  1. CliApp.runWithFileArgs extracts the root command name (e.g. git)
  2. FileOptions.getOptionsFromFiles("git") searches for .git files in cwd → parents → home
  3. Each file is parsed as CLI args, merged by priority (closer wins)
  4. Options.validate merges file defaults with explicit CLI args (CLI wins)
  5. The merged options are validated and the result is returned

Backward compatibility

  • Command.parse gets fromFiles: List[FileOptions.OptionsFromFile] = Nil — existing call sites unchanged
  • CliApp.run now consults dotfiles by default (via FileOptions.default), but apps that don't have dotfiles see no difference
  • CliApp.runWithoutFileArgs provides an explicit opt-out

/claim #191

…#191)

Implement FileOptions service that reads .<command> dotfiles from cwd,
parent directories, and user home directory. Files closer to cwd take
precedence; CLI args always override file defaults.

- Add FileOptions trait with Live (JVM/Native) and Noop (JS) impls
- Add FileOptionsPlatformSpecific for platform-specific defaults
- Update CliApp with runWithFileArgs/runWithoutFileArgs methods
- Thread fromFiles parameter through Command.parse hierarchy
- Add mergeFileOptions/mergeFileAndInputOptions to Options.validate
- Add comprehensive tests for priority/override semantics
@CLAassistant
Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants