From ba85b97a0fd06c3c400bb4522e818b7676b72d07 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Sat, 30 Mar 2019 00:06:29 +0000 Subject: [PATCH] [feature:gem] Add gem:release rake task (#36) --- Rakefile | 60 +++++++++++++++++++++++++++++++++++++++++++--- arx.gemspec | 1 + lib/arx/version.rb | 2 +- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/Rakefile b/Rakefile index f83e6b1..a33ff21 100644 --- a/Rakefile +++ b/Rakefile @@ -1,3 +1,4 @@ +require 'thor' require 'bundler/gem_tasks' require 'rspec/core/rake_task' RSpec::Core::RakeTask.new :spec @@ -5,7 +6,60 @@ RSpec::Core::RakeTask.new :spec desc 'Run application specs' task default: [:spec] -desc 'Debug the gem (load into IRB)' -task :debug do - exec 'bundle exec rake install && irb -I lib/arx.rb -r arx' +namespace :gem do + class T < Thor + include Thor::Actions + end + + desc 'Debug the gem (load into IRB)' + task :debug do + exec 'bundle exec rake install && irb -I lib/arx.rb -r arx' + end + + desc 'Prepare a new gem release' + task :release, %i[major minor patch meta] do |task, args| + array = args.to_a + raise ArgumentError.new("Expected at least 3 SemVer segments, got #{array.size}") if array.size < 3 + raise ArgumentError.new("Expected no more than 4 SemVer segments, got #{array.size}") if array.size > 4 + args.to_h.each_with_index do |(segment, value), index| + next if index == array.size - 1 && array.size == 4 + raise TypeError.new("Invalid #{segment} SemVer segment: #{value}") unless value == value.to_i.to_s + end + + versions = args.to_h.transform_values {|v| v.to_i if Integer(v) rescue v} + versions[:meta] ||= nil + update_version versions + + version = versions.compact.values.join('.') + add_changelog_entry version + end + + private + + def update_version(versions) + versions.each do |segment, value| + thor :gsub_file, File.join(__dir__, 'lib', 'arx', 'version.rb'), /#{segment}: .*,/, "#{segment}: #{value.inspect}," + end + end + + def add_changelog_entry(version) + thor :insert_into_file, File.join(__dir__, 'CHANGELOG.md'), after: /\A/ do + <<-ENTRY +# #{version} + +#### Major changes + +- TODO + +#### Minor changes + +- TODO + + ENTRY + end + end + + def thor(*args, &block) + T.new.send *args, &block + end end \ No newline at end of file diff --git a/arx.gemspec b/arx.gemspec index 3c9366a..44179b6 100644 --- a/arx.gemspec +++ b/arx.gemspec @@ -23,6 +23,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'bundler', '~> 2.0' spec.add_development_dependency 'rake', '~> 12.3' + spec.add_development_dependency 'thor', '~> 0.20' spec.add_development_dependency 'rspec', '~> 3.7' spec.metadata = { diff --git a/lib/arx/version.rb b/lib/arx/version.rb index d45a4c5..177a73b 100644 --- a/lib/arx/version.rb +++ b/lib/arx/version.rb @@ -7,6 +7,6 @@ module Arx major: 0, minor: 3, patch: 1, - meta: nil + meta: nil, }.compact.values.join('.').freeze end