class Keepachangelog::MarkdownPrinter

Attributes

options[RW]
versions[RW]

Public Class Methods

new(versions, options = {}) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 6
def initialize(versions, options = {})
  self.options = options
  self.versions = versions
end

Public Instance Methods

to_s() click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 11
def to_s
  [
    "# #{options[:title] || default_title}",
    clean_intro(options[:intro]) || default_intro,
    '',
    parse_versions(versions),
    anchors
  ].flatten.join("\n")
end

Private Instance Methods

anchor(v, i) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 75
def anchor(v, i)
  from_v = i == v.length - 1 ? first_commit : v[i + 1]
  to_v = Gem::Version.correct?(v[i]) ? v[i] : 'HEAD'
  "[#{v[i]}]: #{options[:url]}/compare/#{from_v}...#{to_v}"
end
anchors() click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 69
def anchors
  return nil unless options[:url]
  v = versions.keys.sort { |a, b| compare_versions(a, b) }.reverse
  (0..v.length - 1).map { |i| anchor(v, i) }
end
change(content) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 81
def change(content)
  "- #{content}"
end
clean_intro(text) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 40
def clean_intro(text)
  return nil unless text
  text.to_s.strip
end
compare_sections(a, b) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 45
def compare_sections(a, b)
  if options[:section_order]
    options[:section_order].index(a) <=> options[:section_order].index(b)
  else
    a <=> b
  end
end
compare_versions(a, b) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 28
def compare_versions(a, b)
  if Gem::Version.correct?(a) && Gem::Version.correct?(b)
    Gem::Version.new(a) <=> Gem::Version.new(b)
  elsif Gem::Version.correct?(a)
    -1
  elsif Gem::Version.correct?(b)
    1
  else
    a <=> b
  end
end
default_intro() click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 89
    def default_intro
      "All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/)."
    end
default_title() click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 85
def default_title
  'Change log'
end
first_commit() click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 96
def first_commit
  `git rev-parse --short $(git rev-list --max-parents=0 HEAD) 2>/dev/null`
    .strip
end
parse_versions(versions) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 23
def parse_versions(versions)
  versions.sort { |a, b| compare_versions(a[0], b[0]) }
          .reverse_each.map { |k, v| version(k, v) }
end
section(header, content) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 61
def section(header, content)
  [
    "### #{header}",
    content.sort.map { |c| change(c) },
    ''
  ]
end
version(header, content) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 53
def version(header, content)
  [
    version_header(header, content['date']),
    content['changes'].sort { |a, b| compare_sections(a[0], b[0]) }
                      .map { |k, v| section(k, v) }
  ]
end
version_header(version, date) click to toggle source
# File lib/keepachangelog/printer/markdown.rb, line 101
def version_header(version, date)
  header = version
  header = "[#{header}]" if options[:url]
  header += " - #{date}" if date
  "## #{header}"
end