diff --git a/flake.lock b/flake.lock index 7765c01..f84e5f5 100644 --- a/flake.lock +++ b/flake.lock @@ -34,24 +34,6 @@ "type": "github" } }, - "flake-utils_2": { - "inputs": { - "systems": "systems_2" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "nixpkgs": { "locked": { "lastModified": 1781074563, @@ -71,7 +53,7 @@ "nixpkgs-ruby": { "inputs": { "flake-compat": "flake-compat", - "flake-utils": "flake-utils_2", + "flake-utils": "flake-utils", "nixpkgs": [ "nixpkgs" ] @@ -92,9 +74,9 @@ }, "root": { "inputs": { - "flake-utils": "flake-utils", "nixpkgs": "nixpkgs", - "nixpkgs-ruby": "nixpkgs-ruby" + "nixpkgs-ruby": "nixpkgs-ruby", + "systems": "systems_2" } }, "systems": { diff --git a/flake.nix b/flake.nix index 8e2044c..34c1ed5 100644 --- a/flake.nix +++ b/flake.nix @@ -5,7 +5,7 @@ nixpkgs-ruby.url = "github:bobvanderlinden/nixpkgs-ruby"; nixpkgs-ruby.inputs.nixpkgs.follows = "nixpkgs"; - flake-utils.url = "github:numtide/flake-utils"; + systems.url = "github:nix-systems/default"; }; outputs = @@ -13,218 +13,227 @@ self, nixpkgs, nixpkgs-ruby, - flake-utils, + systems, }: - flake-utils.lib.eachDefaultSystem ( - system: - let - pkgs = nixpkgs.legacyPackages.${system}; - lib = pkgs.lib; - - defaultGroups = [ - "default" - "production" - "development" - "test" - ]; - - gemsets = - let - entries = if builtins.pathExists ./gemsets then builtins.readDir ./gemsets else { }; - dirs = lib.filterAttrs (_name: type: type == "directory") entries; - in - lib.mapAttrs (name: _type: { - path = ./gemsets/${name}; - groups = defaultGroups; - }) dirs; - - mkRuby = - name: cfg: - let - ruby = nixpkgs-ruby.lib.packageFromRubyVersionFile { - file = "${cfg.path}/ruby-version"; - inherit system; - }; + let + lib = nixpkgs.lib; + forEachSystem = lib.genAttrs (import systems); + + perSystem = forEachSystem ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + + defaultGroups = [ + "default" + "production" + "development" + "test" + ]; - gems = pkgs.bundlerEnv { - name = "ruby-gemset-${name}"; - inherit ruby; - gemfile = "${cfg.path}/Gemfile"; - lockfile = "${cfg.path}/Gemfile.lock"; - gemset = "${cfg.path}/gemset.nix"; - groups = cfg.groups; - }; - in - gems.wrappedRuby; - - rubies = lib.mapAttrs mkRuby gemsets; - - mkRubyApp = _name: ruby: { - type = "app"; - program = "${ruby}/bin/ruby"; - }; - - mkBundleApp = - name: ruby: - let - script = pkgs.writeShellScriptBin "bundle-${name}" '' - set -euo pipefail - export BUNDLE_GEMFILE="$PWD/gemsets/${name}/Gemfile" - exec ${ruby}/bin/bundle "$@" - ''; - in - { + gemsets = + let + entries = if builtins.pathExists ./gemsets then builtins.readDir ./gemsets else { }; + dirs = lib.filterAttrs (_name: type: type == "directory") entries; + in + lib.mapAttrs (name: _type: { + path = ./gemsets/${name}; + groups = defaultGroups; + }) dirs; + + mkRuby = + name: cfg: + let + ruby = nixpkgs-ruby.lib.packageFromRubyVersionFile { + file = "${cfg.path}/ruby-version"; + inherit system; + }; + + gems = pkgs.bundlerEnv { + name = "ruby-gemset-${name}"; + inherit ruby; + gemfile = "${cfg.path}/Gemfile"; + lockfile = "${cfg.path}/Gemfile.lock"; + gemset = "${cfg.path}/gemset.nix"; + groups = cfg.groups; + }; + in + gems.wrappedRuby; + + rubies = lib.mapAttrs mkRuby gemsets; + + mkRubyApp = _name: ruby: { type = "app"; - program = "${script}/bin/bundle-${name}"; + program = "${ruby}/bin/ruby"; }; - helper = pkgs.writeShellApplication { - name = "gemset"; - runtimeInputs = [ - pkgs.bundler - pkgs.bundix - pkgs.git - ]; - - text = '' - usage() { - cat <&2; exit 1 ;; - esac - - dir="gemsets/$name" - - case "$cmd" in - create) - mkdir -p "$dir" - - if [ ! -f "$dir/ruby-version" ]; then - printf '%s\n' "$ruby_version" > "$dir/ruby-version" - fi - - if [ ! -f "$dir/Gemfile" ]; then - cat > "$dir/Gemfile" <<'EOF' - source "https://rubygems.org" - - # gem "rake" - EOF - fi - - touch "$dir/Gemfile.lock" - - if [ ! -f "$dir/gemset.nix" ]; then - printf '{ }\n' > "$dir/gemset.nix" - fi - - echo "Created $dir" - echo "Run: git add $dir" - echo "Then: nix develop .#$name" - ;; - - delete) - rm -rf "$dir" - echo "Deleted $dir" - echo "Remove it from Git with: git add -A $dir" - ;; - - lock) - cd "$dir" - bundle lock - bundix - echo "Updated $dir/Gemfile.lock and $dir/gemset.nix" - ;; + mkBundleApp = + name: ruby: + let + script = pkgs.writeShellScriptBin "bundle-${name}" '' + set -euo pipefail + export BUNDLE_GEMFILE="$PWD/gemsets/${name}/Gemfile" + exec ${ruby}/bin/bundle "$@" + ''; + in + { + type = "app"; + program = "${script}/bin/bundle-${name}"; + }; - update) - cd "$dir" - bundle update - bundix - echo "Updated $dir/Gemfile.lock and $dir/gemset.nix" - ;; + helper = pkgs.writeShellApplication { + name = "gemset"; + runtimeInputs = [ + pkgs.bundler + pkgs.bundix + pkgs.git + ]; - *) + text = '' + usage() { + cat <&2; exit 1 ;; + esac + + dir="gemsets/$name" + + case "$cmd" in + create) + mkdir -p "$dir" + + if [ ! -f "$dir/ruby-version" ]; then + printf '%s\n' "$ruby_version" > "$dir/ruby-version" + fi + + if [ ! -f "$dir/Gemfile" ]; then + cat > "$dir/Gemfile" <<'EOF' + source "https://rubygems.org" + + # gem "rake" + EOF + fi + + touch "$dir/Gemfile.lock" + + if [ ! -f "$dir/gemset.nix" ]; then + printf '{ }\n' > "$dir/gemset.nix" + fi + + echo "Created $dir" + echo "Run: git add $dir" + echo "Then: nix develop .#$name" + ;; + + delete) + rm -rf "$dir" + echo "Deleted $dir" + echo "Remove it from Git with: git add -A $dir" + ;; + + lock) + cd "$dir" + bundle lock + bundix + echo "Updated $dir/Gemfile.lock and $dir/gemset.nix" + ;; + + update) + cd "$dir" + bundle update + bundix + echo "Updated $dir/Gemfile.lock and $dir/gemset.nix" + ;; + + *) + usage + exit 1 + ;; + esac ''; - in - { - type = "app"; - program = "${script}/bin/gemset-${subcommand}"; }; - mkRubyShell = - name: ruby: - pkgs.mkShell { - packages = [ - ruby - pkgs.bundix - helper - ]; + mkHelperApp = + subcommand: + let + script = pkgs.writeShellScriptBin "gemset-${subcommand}" '' + exec ${helper}/bin/gemset ${subcommand} "$@" + ''; + in + { + type = "app"; + program = "${script}/bin/gemset-${subcommand}"; + }; - BUNDLE_GEMFILE = "gemsets/${name}/Gemfile"; - }; - in - { - packages = rubies // { - gemset-helper = helper; - }; - - apps = - lib.mapAttrs mkRubyApp rubies - // lib.mapAttrs' (name: ruby: lib.nameValuePair "bundle-${name}" (mkBundleApp name ruby)) rubies - // lib.optionalAttrs (rubies ? default) { - default = mkRubyApp "default" rubies.default; - ruby = mkRubyApp "default" rubies.default; - } - // { - gemset-create = mkHelperApp "create"; - gemset-delete = mkHelperApp "delete"; - gemset-lock = mkHelperApp "lock"; - gemset-update = mkHelperApp "update"; + mkRubyShell = + name: ruby: + pkgs.mkShell { + packages = [ + ruby + pkgs.bundix + helper + ]; + + BUNDLE_GEMFILE = "gemsets/${name}/Gemfile"; + }; + in + { + packages = rubies // { + gemset-helper = helper; }; - devShells = lib.mapAttrs mkRubyShell rubies // { - default = pkgs.mkShell { - packages = [ - pkgs.bundix - helper - ] - ++ builtins.attrValues rubies; + apps = + lib.mapAttrs mkRubyApp rubies + // lib.mapAttrs' (name: ruby: lib.nameValuePair "bundle-${name}" (mkBundleApp name ruby)) rubies + // lib.optionalAttrs (rubies ? default) { + default = mkRubyApp "default" rubies.default; + ruby = mkRubyApp "default" rubies.default; + } + // { + gemset-create = mkHelperApp "create"; + gemset-delete = mkHelperApp "delete"; + gemset-lock = mkHelperApp "lock"; + gemset-update = mkHelperApp "update"; + }; + + devShells = lib.mapAttrs mkRubyShell rubies // { + default = pkgs.mkShell { + packages = [ + pkgs.bundix + helper + ] + ++ builtins.attrValues rubies; + }; }; - }; - } - ); + } + ); + in + { + packages = forEachSystem (system: perSystem.${system}.packages); + apps = forEachSystem (system: perSystem.${system}.apps); + devShells = forEachSystem (system: perSystem.${system}.devShells); + }; }