Module: SafeMemoize::ReleaseTooling

Defined in:
lib/safe_memoize/release_tooling.rb

Constant Summary collapse

VERSION_PATTERN =
/VERSION = "[^"]+"/
SEMVER_PATTERN =
/\A\d+\.\d+\.\d+(?:[-.][0-9A-Za-z]+(?:[.-][0-9A-Za-z]+)*)?\z/
UNRELEASED_HEADING =
"## [Unreleased]"

Class Method Summary collapse

Class Method Details

.extract_release_notes(contents, version) ⇒ Object

Raises:

  • (ArgumentError)


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/safe_memoize/release_tooling.rb', line 48

def extract_release_notes(contents, version)
  normalized_version = normalize_version(version)
  lines = contents.lines
  release_heading = /^## \[#{Regexp.escape(normalized_version)}\](?: - .+)?$/
  start_index = lines.index { |line| line.match?(release_heading) }

  raise ArgumentError, "CHANGELOG.md is missing release notes for #{normalized_version}" unless start_index

  body = lines[(start_index + 1)..].take_while { |line| !line.start_with?("## [") }.join.strip
  body = "- No changes listed." if body.empty?

  <<~MARKDOWN
    ## SafeMemoize #{normalized_version}

    #{body}
  MARKDOWN
end

.finalize_changelog(contents, version, date = Date.today) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/safe_memoize/release_tooling.rb', line 33

def finalize_changelog(contents, version, date = Date.today)
  normalized_version = normalize_version(version)
  release_heading = "## [#{normalized_version}] - #{date.iso8601}"

  unless contents.include?(UNRELEASED_HEADING)
    raise ArgumentError, "CHANGELOG.md must contain an Unreleased heading"
  end

  if contents.match?(/^## \[#{Regexp.escape(normalized_version)}\](?: - .+)?$/)
    raise ArgumentError, "CHANGELOG.md already contains #{normalized_version}"
  end

  contents.sub(UNRELEASED_HEADING, "#{UNRELEASED_HEADING}\n\n#{release_heading}")
end

.normalize_version(version) ⇒ Object



13
14
15
16
17
18
19
20
21
# File 'lib/safe_memoize/release_tooling.rb', line 13

def normalize_version(version)
  normalized_version = version.to_s.sub(/\Av/, "")

  unless normalized_version.match?(SEMVER_PATTERN)
    raise ArgumentError, "version must look like x.y.z"
  end

  normalized_version
end

.update_version_file(contents, version) ⇒ Object



23
24
25
26
27
28
29
30
31
# File 'lib/safe_memoize/release_tooling.rb', line 23

def update_version_file(contents, version)
  normalized_version = normalize_version(version)

  unless contents.match?(VERSION_PATTERN)
    raise ArgumentError, "version file does not define VERSION"
  end

  contents.sub(VERSION_PATTERN, %(VERSION = "#{normalized_version}"))
end