Class: RosettAi::Thor::Tasks::Release

Inherits:
Thor
  • Object
show all
Defined in:
lib/rosett_ai/thor/tasks/release.rb

Overview

Thor task for managing rai releases.

Provides a repeatable, verified release workflow: prepare — bump version, generate CHANGELOG, create release commit tag — create annotated git tag from current VERSION status — show version, last tag, and unreleased commit count

Design reference: conf/design/release_management.yml

Constant Summary collapse

VALID_LEVELS =
['major', 'minor', 'patch'].freeze
VERIFICATION_GATES =
[
  ['rspec',         ['bundle', 'exec', 'rspec', '--format', 'progress']],
  ['rubocop',       ['bundle', 'exec', 'rubocop', '--format', 'simple']],
  ['reek',          ['bundle', 'exec', 'reek', '--no-color']],
  ['bundler-audit', ['bundle', 'exec', 'bundler-audit', 'check']],
  ['ruby-audit',    ['bundle', 'exec', 'ruby-audit', 'check']]
].freeze

Instance Method Summary collapse

Instance Method Details

#prepare(level) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/rosett_ai/thor/tasks/release.rb', line 54

def prepare(level)
  validate_level!(level)
  ensure_clean_working_tree!
  run_verification_gates! unless options[:skip_verify]

  old_version = current_version
  new_version = bump_version(old_version, level)

  write_version!(new_version)
  changelog_text = generate_changelog(new_version)
  update_changelog!(new_version, changelog_text)

  create_release_commit!(new_version)

  puts
  puts Rainbow(t('prepare.success', version: new_version)).green
  puts t('prepare.next_steps', version: new_version)
end

#statusObject



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/rosett_ai/thor/tasks/release.rb', line 111

def status
  version = current_version
  last_tag = latest_tag
  commit_count = commits_since_tag(last_tag)

  rows = [
    [t('status.version_label'), version],
    [t('status.last_tag_label'), last_tag || t('status.no_tags')],
    [t('status.commits_label'), commit_count.to_s]
  ]

  table = ::Terminal::Table.new(
    title: Rainbow(t('status.title')).bright,
    rows: rows,
    style: { border: :unicode_round }
  )
  puts table
end

#tagObject

Raises:

  • (::Thor::Error)


88
89
90
91
92
93
94
95
96
97
98
# File 'lib/rosett_ai/thor/tasks/release.rb', line 88

def tag
  version = current_version
  tag_name = "v#{version}"

  raise ::Thor::Error, t('tag.exists', tag: tag_name) if tag_exists?(tag_name)

  message = extract_changelog_section(version)
  create_annotated_tag!(tag_name, message)

  puts Rainbow(t('tag.success', tag: tag_name)).green
end