|
| 1 | +#!/usr/bin/env ruby |
| 2 | +# frozen_string_literal: true |
| 3 | + |
| 4 | +# Script to update Ruby version requirements in all gemspecs |
| 5 | +# Usage: bin/update-ruby-version [new_version] |
| 6 | +# Example: bin/update-ruby-version 3.3 |
| 7 | + |
| 8 | +require 'fileutils' |
| 9 | +require 'rubygems' |
| 10 | + |
| 11 | +def update_gemspec_ruby_version(file_path, new_version) |
| 12 | + content = File.read(file_path) |
| 13 | + |
| 14 | + # Pattern to match existing inline version (supports alpha/beta/pre-release versions) |
| 15 | + inline_pattern = /spec\.required_ruby_version = '>= [^']+'/ |
| 16 | + replacement = "spec.required_ruby_version = '>= #{new_version}'" |
| 17 | + |
| 18 | + updated_content = content.gsub(inline_pattern, replacement) |
| 19 | + File.write(file_path, updated_content) |
| 20 | +end |
| 21 | + |
| 22 | +def find_gemspecs_with_ruby_requirement |
| 23 | + # Find all .gemspec files that contain inline Ruby version requirements |
| 24 | + gemspec_files = Dir.glob('**/*.gemspec') |
| 25 | + |
| 26 | + gemspec_files.select do |file| |
| 27 | + content = File.read(file) |
| 28 | + # Match inline version pattern (supports alpha/beta/pre-release versions) |
| 29 | + content.match?(/spec\.required_ruby_version = '>= [^']+/) |
| 30 | + end |
| 31 | +end |
| 32 | + |
| 33 | +# Main execution |
| 34 | +def main |
| 35 | + new_version = ARGV[0] |
| 36 | + |
| 37 | + # Check if version parameter is provided |
| 38 | + if new_version.nil? || new_version.empty? |
| 39 | + puts 'Error: No Ruby version specified.' |
| 40 | + puts |
| 41 | + puts "Usage: #{$0} <new_ruby_version>" |
| 42 | + puts 'Examples:' |
| 43 | + puts " #{$0} 3.2" |
| 44 | + puts " #{$0} 3.3" |
| 45 | + puts " #{$0} 3.1.0" |
| 46 | + puts |
| 47 | + puts 'The version should be a valid Ruby version number (e.g., 3.2, 3.3, 3.1.0)' |
| 48 | + exit 1 |
| 49 | + end |
| 50 | + |
| 51 | + # Validate version format using Ruby's Gem::Version parser |
| 52 | + begin |
| 53 | + # Try to parse as a valid gem version (this will raise ArgumentError for malformed versions) |
| 54 | + Gem::Version.new(new_version) |
| 55 | + rescue ArgumentError => e |
| 56 | + puts "Error: Invalid Ruby version format '#{new_version}'" |
| 57 | + puts "Details: #{e.message}" |
| 58 | + puts |
| 59 | + puts 'The version must be a valid Ruby version number like:' |
| 60 | + puts ' - 3.2' |
| 61 | + puts ' - 3.3' |
| 62 | + puts ' - 3.1.0' |
| 63 | + puts ' - 3.4.0.alpha' |
| 64 | + puts ' - 3.3.0.beta1' |
| 65 | + puts |
| 66 | + puts "Usage: #{$0} <new_ruby_version>" |
| 67 | + exit 1 |
| 68 | + end |
| 69 | + |
| 70 | + puts "Updating Ruby version requirement to: >= #{new_version}" |
| 71 | + puts 'Finding gemspec files...' |
| 72 | + |
| 73 | + gemspec_files = find_gemspecs_with_ruby_requirement |
| 74 | + puts "Found #{gemspec_files.length} gemspec files to update:" |
| 75 | + |
| 76 | + gemspec_files.each do |file| |
| 77 | + update_gemspec_ruby_version(file, new_version) |
| 78 | + puts "Updated: #{file}" |
| 79 | + end |
| 80 | + |
| 81 | + puts "\nSummary:" |
| 82 | + puts "- Total files found: #{gemspec_files.length}" |
| 83 | + puts "- Successfully updated: #{gemspec_files.length}" |
| 84 | + |
| 85 | + puts "\nDone! All gemspecs have been updated to require Ruby >= #{new_version}" |
| 86 | +end |
| 87 | + |
| 88 | +main if __FILE__ == $0 |
0 commit comments