Skip to content

Commit e3bb4c2

Browse files
AI Assistantclaude
andcommitted
feat(ruby): add rbenv-based Ruby and gem management with latest versions
Problem: Ruby and gem were installed via apt at outdated versions - Ruby 3.2.3 (apt) vs 3.3.6+ (upstream) - gem 3.4.20 (apt) vs 3.7.2 (upstream) - No way to update to latest versions Solution: Add rbenv version manager (like nvm for Node, rustup for Rust) Added catalogs: - rbenv.json: Ruby version manager - ruby-build.json: rbenv plugin for installing Ruby versions - ruby.json: Ruby runtime with rbenv integration - gem.json: Updated to use `gem update --system` Added installers: - install_ruby.sh: Install/update Ruby via rbenv - Removes apt-managed Ruby in favor of rbenv - Installs latest stable Ruby (3.3.6+) - Includes reconcile action for guide.sh - install_gem.sh: Update gem via `gem update --system` - Works with rbenv-managed Ruby - Updates bundler and rake - Rehashes rbenv shims Updated common.sh: - ensure_rbenv_loaded(): Initialize rbenv in shell - prefers_rbenv_ruby(): Check if Ruby is rbenv-managed This enables: - `make install-ruby` or `scripts/install_ruby.sh reconcile` - `scripts/install_gem.sh update` for gem updates - `make upgrade` will suggest Ruby/gem upgrades 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent f04c503 commit e3bb4c2

File tree

7 files changed

+279
-9
lines changed

7 files changed

+279
-9
lines changed

catalog/gem.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
"name": "gem",
3-
"install_method": "package_manager",
4-
"description": "Ruby package manager",
3+
"install_method": "dedicated_script",
4+
"description": "Ruby package manager (RubyGems)",
55
"homepage": "https://rubygems.org/",
66
"binary_name": "gem",
7-
"packages": {
8-
"apt": "ruby-rubygems",
9-
"brew": "ruby",
10-
"dnf": "rubygems",
11-
"pacman": "rubygems"
12-
},
13-
"notes": "gem typically comes with Ruby. Installing ruby package will also install gem."
7+
"script": "install_gem.sh",
8+
"notes": "gem comes bundled with Ruby. Updates via 'gem update --system'. Requires Ruby to be installed via rbenv."
9+
,"guide": {
10+
"display_name": "gem (RubyGems)",
11+
"install_action": "update",
12+
"order": 33
13+
}
1414
}

catalog/rbenv.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "rbenv",
3+
"install_method": "github_clone",
4+
"description": "Ruby version manager",
5+
"homepage": "https://github.com/rbenv/rbenv",
6+
"github_repo": "rbenv/rbenv",
7+
"binary_name": "rbenv",
8+
"clone_path": "~/.rbenv",
9+
"install_script": "src/configure && make -C src"
10+
,"guide": {
11+
"display_name": "rbenv",
12+
"install_action": "install",
13+
"order": 30
14+
}
15+
}

catalog/ruby-build.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "ruby-build",
3+
"install_method": "github_clone",
4+
"description": "Install Ruby versions (rbenv plugin)",
5+
"homepage": "https://github.com/rbenv/ruby-build",
6+
"github_repo": "rbenv/ruby-build",
7+
"binary_name": "ruby-build",
8+
"clone_path": "~/.rbenv/plugins/ruby-build",
9+
"notes": "Installs as rbenv plugin. Requires rbenv to be installed first."
10+
,"guide": {
11+
"display_name": "ruby-build",
12+
"install_action": "install",
13+
"order": 31
14+
}
15+
}

catalog/ruby.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "ruby",
3+
"install_method": "dedicated_script",
4+
"description": "Ruby programming language",
5+
"homepage": "https://www.ruby-lang.org/",
6+
"github_repo": "ruby/ruby",
7+
"binary_name": "ruby",
8+
"script": "install_ruby.sh",
9+
"notes": "Installed via rbenv for version management. Removes apt-managed Ruby in favor of rbenv."
10+
,"guide": {
11+
"display_name": "Ruby (rbenv)",
12+
"install_action": "reconcile",
13+
"order": 32
14+
}
15+
}

scripts/install_gem.sh

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5+
. "$DIR/lib/common.sh"
6+
7+
ACTION="${1:-update}"
8+
9+
ensure_rbenv_loaded() {
10+
# Add rbenv to PATH and initialize if available
11+
if [ -d "$HOME/.rbenv" ]; then
12+
export PATH="$HOME/.rbenv/bin:$PATH"
13+
if command -v rbenv >/dev/null 2>&1; then
14+
eval "$(rbenv init - bash)" || true
15+
fi
16+
fi
17+
}
18+
19+
update_gem() {
20+
ensure_rbenv_loaded
21+
22+
if ! command -v gem >/dev/null 2>&1; then
23+
echo "[gem] Error: gem not found. Install Ruby first via 'make install-ruby' or 'scripts/install_ruby.sh'" >&2
24+
return 1
25+
fi
26+
27+
local before after path
28+
before="$(gem --version 2>/dev/null || echo '<none>')"
29+
30+
# Update RubyGems itself
31+
gem update --system || true
32+
33+
# Update bundler and rake
34+
gem update bundler rake || true
35+
36+
# Rehash rbenv shims if using rbenv
37+
if command -v rbenv >/dev/null 2>&1; then
38+
rbenv rehash || true
39+
fi
40+
41+
after="$(gem --version 2>/dev/null || echo '<none>')"
42+
path="$(command -v gem 2>/dev/null || echo '<none>')"
43+
44+
printf "[%s] before: %s\n" "gem" "$before"
45+
printf "[%s] after: %s\n" "gem" "$after"
46+
printf "[%s] path: %s\n" "gem" "$path"
47+
}
48+
49+
install_gem() {
50+
echo "[gem] gem comes bundled with Ruby. Installing/updating Ruby instead..."
51+
"$DIR/install_ruby.sh" install || true
52+
update_gem
53+
}
54+
55+
reconcile_gem() {
56+
ensure_rbenv_loaded
57+
58+
if ! command -v gem >/dev/null 2>&1; then
59+
echo "[gem] gem not found. Installing Ruby (which includes gem)..."
60+
"$DIR/install_ruby.sh" reconcile || true
61+
fi
62+
63+
update_gem
64+
}
65+
66+
uninstall_gem() {
67+
echo "[gem] gem is bundled with Ruby. To remove gem, uninstall Ruby via 'scripts/install_ruby.sh uninstall'" >&2
68+
}
69+
70+
case "$ACTION" in
71+
install) install_gem ;;
72+
update) update_gem ;;
73+
uninstall) uninstall_gem ;;
74+
reconcile) reconcile_gem ;;
75+
*) echo "Usage: $0 {install|update|uninstall|reconcile}" ; exit 2 ;;
76+
esac

scripts/install_ruby.sh

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5+
. "$DIR/lib/common.sh"
6+
7+
ACTION="${1:-reconcile}"
8+
# Target Ruby version (default: latest stable)
9+
RUBY_VERSION="${RUBY_VERSION:-3.3.6}"
10+
11+
ensure_rbenv() {
12+
if [ ! -d "$HOME/.rbenv" ]; then
13+
echo "Installing rbenv..."
14+
git clone https://github.com/rbenv/rbenv.git "$HOME/.rbenv"
15+
cd "$HOME/.rbenv" && src/configure && make -C src || true
16+
fi
17+
18+
# Install ruby-build plugin if missing
19+
if [ ! -d "$HOME/.rbenv/plugins/ruby-build" ]; then
20+
echo "Installing ruby-build plugin..."
21+
git clone https://github.com/rbenv/ruby-build.git "$HOME/.rbenv/plugins/ruby-build"
22+
fi
23+
24+
ensure_rbenv_loaded
25+
}
26+
27+
ensure_rbenv_loaded() {
28+
# Add rbenv to PATH and initialize if not already done
29+
export PATH="$HOME/.rbenv/bin:$PATH"
30+
if command -v rbenv >/dev/null 2>&1; then
31+
eval "$(rbenv init - bash)" || true
32+
fi
33+
}
34+
35+
get_latest_ruby_version() {
36+
ensure_rbenv
37+
# Get latest stable Ruby version from rbenv
38+
rbenv install --list 2>/dev/null | grep -E '^\s*[0-9]+\.[0-9]+\.[0-9]+$' | tail -1 | tr -d ' ' || echo "3.3.6"
39+
}
40+
41+
install_ruby() {
42+
ensure_rbenv
43+
44+
# Use latest if RUBY_VERSION not specified
45+
if [ "$RUBY_VERSION" = "latest" ]; then
46+
RUBY_VERSION=$(get_latest_ruby_version)
47+
fi
48+
49+
echo "Installing Ruby $RUBY_VERSION via rbenv..."
50+
rbenv install --skip-existing "$RUBY_VERSION" || true
51+
rbenv global "$RUBY_VERSION" || true
52+
rbenv rehash || true
53+
54+
# Update gem itself
55+
gem update --system || true
56+
57+
# Install common gems
58+
gem install bundler rake || true
59+
rbenv rehash || true
60+
}
61+
62+
update_ruby() {
63+
ensure_rbenv
64+
65+
# Get current and latest versions
66+
local current_version latest_version
67+
current_version=$(rbenv global 2>/dev/null || echo "")
68+
latest_version=$(get_latest_ruby_version)
69+
70+
echo "Current Ruby: $current_version"
71+
echo "Latest Ruby: $latest_version"
72+
73+
# Install latest if different
74+
if [ "$current_version" != "$latest_version" ]; then
75+
RUBY_VERSION="$latest_version"
76+
install_ruby
77+
else
78+
# Just update gems
79+
gem update --system || true
80+
gem update bundler rake || true
81+
rbenv rehash || true
82+
fi
83+
}
84+
85+
uninstall_ruby() {
86+
# Remove rbenv-managed Ruby
87+
if [ -d "$HOME/.rbenv" ]; then
88+
rm -rf "$HOME/.rbenv"
89+
fi
90+
91+
# Remove apt Ruby if present
92+
apt_remove_if_present ruby ruby-dev ruby-rubygems || true
93+
}
94+
95+
prefers_rbenv_ruby() {
96+
local ruby_path
97+
ruby_path="$(command -v ruby 2>/dev/null || true)"
98+
99+
# Prefer rbenv if Ruby is under ~/.rbenv
100+
case "$ruby_path" in
101+
"$HOME/.rbenv/"*) return 0 ;;
102+
*) return 1 ;;
103+
esac
104+
}
105+
106+
reconcile_ruby() {
107+
local before after path
108+
before="$(command -v ruby >/dev/null 2>&1 && ruby --version || true)"
109+
110+
if ! prefers_rbenv_ruby; then
111+
echo "Removing apt-managed Ruby in favor of rbenv..."
112+
apt_remove_if_present ruby ruby-dev ruby-rubygems || true
113+
install_ruby
114+
else
115+
update_ruby
116+
fi
117+
118+
after="$(command -v ruby >/dev/null 2>&1 && ruby --version || true)"
119+
path="$(command -v ruby 2>/dev/null || true)"
120+
121+
printf "[%s] before: %s\n" "ruby" "${before:-<none>}"
122+
printf "[%s] after: %s\n" "ruby" "${after:-<none>}"
123+
if [ -n "$path" ]; then printf "[%s] path: %s\n" "ruby" "$path"; fi
124+
}
125+
126+
case "$ACTION" in
127+
install) install_ruby ;;
128+
update) update_ruby ;;
129+
uninstall) uninstall_ruby ;;
130+
reconcile) reconcile_ruby ;;
131+
*) echo "Usage: $0 {install|update|uninstall|reconcile}" ; exit 2 ;;
132+
esac

scripts/lib/common.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,21 @@ prefers_rustup() {
6565
is_path_under "$p" "$HOME/.cargo" || return 1
6666
}
6767

68+
# rbenv helpers
69+
ensure_rbenv_loaded() {
70+
# Add rbenv to PATH and initialize if available
71+
if [ -d "$HOME/.rbenv" ]; then
72+
export PATH="$HOME/.rbenv/bin:$PATH"
73+
if command -v rbenv >/dev/null 2>&1; then
74+
eval "$(rbenv init - bash)" || true
75+
fi
76+
fi
77+
}
78+
79+
prefers_rbenv_ruby() {
80+
local p
81+
p="$(command -v ruby || true)"
82+
is_path_under "$p" "$HOME/.rbenv" || return 1
83+
}
84+
6885

0 commit comments

Comments
 (0)