diff --git a/modules/programs/fabric-ai.nix b/modules/programs/fabric-ai.nix new file mode 100644 index 000000000..ce2d89a25 --- /dev/null +++ b/modules/programs/fabric-ai.nix @@ -0,0 +1,72 @@ +{ + lib, + pkgs, + config, + ... +}: +let + inherit (lib) + mkIf + mkEnableOption + mkPackageOption + ; + + inherit (lib.hm.shell) + mkBashIntegrationOption + mkZshIntegrationOption + ; + + cfg = config.programs.fabric-ai; +in +{ + meta.maintainers = with lib.hm.maintainers; [ aguirre-matteo ]; + options.programs.fabric-ai = { + enable = mkEnableOption "Fabric AI"; + package = mkPackageOption pkgs "fabric-ai" { nullable = true; }; + enablePatternsAliases = mkEnableOption "aliases for all Fabric's patterns"; + enableYtAlias = mkEnableOption "Fabric's `yt` alias" // { + default = true; + }; + enableBashIntegration = mkBashIntegrationOption { inherit config; }; + enableZshIntegration = mkZshIntegrationOption { inherit config; }; + }; + + config = + let + posixShellCode = '' + ${lib.optionalString cfg.enablePatternsAliases '' + for pattern_file in $HOME/.config/fabric/patterns/*; do + pattern_name="$(basename "$pattern_file")" + alias_name="''${FABRIC_ALIAS_PREFIX:-}''${pattern_name}" + + alias_command="alias $alias_name='fabric --pattern $pattern_name'" + + eval "$alias_command" + done + ''} + + ${lib.optionalString cfg.enableYtAlias '' + yt() { + if [ "$#" -eq 0 ] || [ "$#" -gt 2 ]; then + echo "Usage: yt [-t | --timestamps] youtube-link" + echo "Use the '-t' flag to get the transcript with timestamps." + return 1 + fi + + transcript_flag="--transcript" + if [ "$1" = "-t" ] || [ "$1" = "--timestamps" ]; then + transcript_flag="--transcript-with-timestamps" + shift + fi + local video_link="$1" + fabric -y "$video_link" $transcript_flag + } + ''} + ''; + in + mkIf cfg.enable { + home.packages = mkIf (cfg.package != null) [ cfg.package ]; + programs.bash.initExtra = mkIf cfg.enableBashIntegration posixShellCode; + programs.zsh.initContent = mkIf cfg.enableZshIntegration posixShellCode; + }; +} diff --git a/tests/modules/programs/fabric-ai/bashrc b/tests/modules/programs/fabric-ai/bashrc new file mode 100644 index 000000000..0e70f37be --- /dev/null +++ b/tests/modules/programs/fabric-ai/bashrc @@ -0,0 +1,39 @@ + + +# Commands that should be applied only for interactive shells. +[[ $- == *i* ]] || return + +HISTFILESIZE=100000 +HISTSIZE=10000 + +shopt -s histappend +shopt -s checkwinsize +shopt -s extglob +shopt -s globstar +shopt -s checkjobs + + + +if [[ ! -v BASH_COMPLETION_VERSINFO ]]; then + . "@bash-completion@/etc/profile.d/bash_completion.sh" +fi + + + +yt() { + if [ "$#" -eq 0 ] || [ "$#" -gt 2 ]; then + echo "Usage: yt [-t | --timestamps] youtube-link" + echo "Use the '-t' flag to get the transcript with timestamps." + return 1 + fi + + transcript_flag="--transcript" + if [ "$1" = "-t" ] || [ "$1" = "--timestamps" ]; then + transcript_flag="--transcript-with-timestamps" + shift + fi + local video_link="$1" + fabric -y "$video_link" $transcript_flag +} + + diff --git a/tests/modules/programs/fabric-ai/default.nix b/tests/modules/programs/fabric-ai/default.nix new file mode 100644 index 000000000..c9c9a97ff --- /dev/null +++ b/tests/modules/programs/fabric-ai/default.nix @@ -0,0 +1,3 @@ +{ + fabric-ai-example-config = ./example-config.nix; +} diff --git a/tests/modules/programs/fabric-ai/example-config.nix b/tests/modules/programs/fabric-ai/example-config.nix new file mode 100644 index 000000000..64ee100eb --- /dev/null +++ b/tests/modules/programs/fabric-ai/example-config.nix @@ -0,0 +1,16 @@ +{ + programs.bash.enable = true; + programs.zsh.enable = true; + programs.fabric-ai = { + enable = true; + enablePattersAliases = true; + }; + + nmt.script = '' + assertFileExists home-files/.bashrc + assertFileExists home-files/.zshrc + + assertFileContent home-files/.bashrc ${./bashrc} + assertFileContent home-files/.zshrc ${./zshrc} + ''; +} diff --git a/tests/modules/programs/fabric-ai/zshrc b/tests/modules/programs/fabric-ai/zshrc new file mode 100644 index 000000000..0817c5028 --- /dev/null +++ b/tests/modules/programs/fabric-ai/zshrc @@ -0,0 +1,46 @@ +typeset -U path cdpath fpath manpath +for profile in ${(z)NIX_PROFILES}; do + fpath+=($profile/share/zsh/site-functions $profile/share/zsh/$ZSH_VERSION/functions $profile/share/zsh/vendor-completions) +done + +HELPDIR="@zsh@/share/zsh/$ZSH_VERSION/help" + +autoload -U compinit && compinit +# History options should be set in .zshrc and after oh-my-zsh sourcing. +# See https://github.com/nix-community/home-manager/issues/177. +HISTSIZE="10000" +SAVEHIST="10000" + +HISTFILE="/home/hm-user/.zsh_history" +mkdir -p "$(dirname "$HISTFILE")" + +setopt HIST_FCNTL_LOCK +unsetopt APPEND_HISTORY +setopt HIST_IGNORE_DUPS +unsetopt HIST_IGNORE_ALL_DUPS +unsetopt HIST_SAVE_NO_DUPS +unsetopt HIST_FIND_NO_DUPS +setopt HIST_IGNORE_SPACE +unsetopt HIST_EXPIRE_DUPS_FIRST +setopt SHARE_HISTORY +unsetopt EXTENDED_HISTORY + + + + +yt() { + if [ "$#" -eq 0 ] || [ "$#" -gt 2 ]; then + echo "Usage: yt [-t | --timestamps] youtube-link" + echo "Use the '-t' flag to get the transcript with timestamps." + return 1 + fi + + transcript_flag="--transcript" + if [ "$1" = "-t" ] || [ "$1" = "--timestamps" ]; then + transcript_flag="--transcript-with-timestamps" + shift + fi + local video_link="$1" + fabric -y "$video_link" $transcript_flag +} +