module Allages

Constants

META_TEMPLATE
VERSION

Public Class Methods

config() click to toggle source
# File lib/allages/config.rb, line 7
def self.config
  @config
end
configure() { |config ||= configuration| ... } click to toggle source
# File lib/allages/config.rb, line 3
def self.configure(&block)
  yield @config ||= Allages::Configuration.new
end
generate() click to toggle source
# File lib/allages.rb, line 16
def generate
  sections = []

  Dir.glob("#{Allages.config.input_dir}/*").each do |filename|
    if File.directory? filename
      section = {}
      dir = File.basename filename
      next if (dir == "Unreleased" && Allages.config.include_unreleased == false)
      section[:name] = dir

      if File.file? "#{filename}/.meta.yml"
        section[:meta] = YAML.load_file "#{filename}/.meta.yml"
      end

      categories = {}
      Dir.glob("#{filename}/*.yml").each do |entry_filename|
        next if entry_filename.match? /\.meta\.yml/
        entry = YAML.load_file entry_filename
        if categories.has_key? entry['type']
          categories[entry['type']] << entry
        else
          categories[entry['type']] = [entry]
        end
      end

      section[:categories] = categories
      sections << section
    end
  end

  sections.sort! do |a, b|
    if a[:name] == "Unreleased"
      -1
    elsif b[:name] == "Unreleased"
      1
    else
      a[:name] <=> b[:name]
    end
  end

  markdown = "#{Allages.config.header}"

  had_previous_section = false
  sections.each do |section|
    markdown << "\n" if had_previous_section
    had_previous_section = true
    title = ["## #{section[:name]}"]
    if section[:meta]
      title << section[:meta]['date'] if section[:meta]['date']
      title << "dependencies: #{section[:meta]['dependencies'].to_a.join(', ')}" unless section[:meta]['dependencies'].to_a.empty?
    end
    markdown << "#{title.join(' - ')}" << "\n"

    section[:categories].each do |category, entries|
      markdown << "### #{category}\n"

      entries.each do |entry|
        entry_md = [entry['description']]
        entry_md << "issue: #{entry['issue']}" if entry['issue']
        entry_md << "dependencies: #{entry['dependencies'].to_a.join(', ')}" unless entry['dependencies'].to_a.empty?
        markdown << "- #{entry_md.join(', ')}\n"
      end
    end
  end

  if Allages.config.output_file.to_sym == :stdout
    puts markdown
  else
    open(Allages.config.output_file, 'w') do |f|
      f.puts markdown
    end
  end
end
new_entry() click to toggle source
# File lib/allages.rb, line 112
  def new_entry
    types = {
      "a" => "Added",
      "c" => "Changed",
      "f" => "Fixed",
      "d" => "Deprecated",
      "r" => "Removed",
      "s" => "Security"
    }

    print "Type (a)dded, (c)hanged, (f)ixed, (d)eprecated, (r)emoved, (s)ecurity: "
    STDOUT.flush
    type = types[STDIN.gets.chomp]

    print "Description: "
    STDOUT.flush
    description = STDIN.gets.chomp

    print "Author: "
    STDOUT.flush
    author = STDIN.gets.chomp

    print "Issue: "
    STDOUT.flush
    issue = STDIN.gets.chomp

    print "Dependencies (comma seperated): "
    STDOUT.flush
    deps = STDIN.gets.chomp.split(',').map{|d| "  - #{d.chomp.lstrip}"}.join("\n")

    yaml = <<~YAML
    date: #{Time.now.strftime('%F')}
    type: #{type}
    description: #{description}
    author: #{author}
    issue: #{issue}
    dependencies:
    #{deps}
    YAML

    filename = "#{SecureRandom.uuid}.yml"
    path = "#{Allages.config.input_dir}/Unreleased/#{filename}"

    open("#{path}", 'w') do |f|
      f.puts yaml
    end
    puts "created new unreleased entry #{path}"
  end
new_version() click to toggle source
# File lib/allages.rb, line 92
def new_version
  print "Version name: "
  STDOUT.flush
  version = STDIN.gets.chomp
  dir = "#{Allages.config.input_dir}/#{version}"
  if File.directory?(dir)
    puts "version already exists"
    exit 1
  else
    FileUtils.mkdir_p(dir)
    puts "created directory #{dir} "
  end

  open("#{dir}/.meta.yml", 'w') do |f|
    f.puts META_TEMPLATE
  end
end
reset_config() click to toggle source
# File lib/allages/config.rb, line 15
  def self.reset_config
    self.configure do |config|
      config.input_dir = 'changelogs'
      config.output_file = :stdout
      config.include_unreleased = false
      config.header = <<~END
      # Changelog
      All notable changes to this project will be documented in this file.

      The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
      and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

      END
    end
  end

Private Instance Methods

generate() click to toggle source
# File lib/allages.rb, line 16
def generate
  sections = []

  Dir.glob("#{Allages.config.input_dir}/*").each do |filename|
    if File.directory? filename
      section = {}
      dir = File.basename filename
      next if (dir == "Unreleased" && Allages.config.include_unreleased == false)
      section[:name] = dir

      if File.file? "#{filename}/.meta.yml"
        section[:meta] = YAML.load_file "#{filename}/.meta.yml"
      end

      categories = {}
      Dir.glob("#{filename}/*.yml").each do |entry_filename|
        next if entry_filename.match? /\.meta\.yml/
        entry = YAML.load_file entry_filename
        if categories.has_key? entry['type']
          categories[entry['type']] << entry
        else
          categories[entry['type']] = [entry]
        end
      end

      section[:categories] = categories
      sections << section
    end
  end

  sections.sort! do |a, b|
    if a[:name] == "Unreleased"
      -1
    elsif b[:name] == "Unreleased"
      1
    else
      a[:name] <=> b[:name]
    end
  end

  markdown = "#{Allages.config.header}"

  had_previous_section = false
  sections.each do |section|
    markdown << "\n" if had_previous_section
    had_previous_section = true
    title = ["## #{section[:name]}"]
    if section[:meta]
      title << section[:meta]['date'] if section[:meta]['date']
      title << "dependencies: #{section[:meta]['dependencies'].to_a.join(', ')}" unless section[:meta]['dependencies'].to_a.empty?
    end
    markdown << "#{title.join(' - ')}" << "\n"

    section[:categories].each do |category, entries|
      markdown << "### #{category}\n"

      entries.each do |entry|
        entry_md = [entry['description']]
        entry_md << "issue: #{entry['issue']}" if entry['issue']
        entry_md << "dependencies: #{entry['dependencies'].to_a.join(', ')}" unless entry['dependencies'].to_a.empty?
        markdown << "- #{entry_md.join(', ')}\n"
      end
    end
  end

  if Allages.config.output_file.to_sym == :stdout
    puts markdown
  else
    open(Allages.config.output_file, 'w') do |f|
      f.puts markdown
    end
  end
end
new_entry() click to toggle source
# File lib/allages.rb, line 112
  def new_entry
    types = {
      "a" => "Added",
      "c" => "Changed",
      "f" => "Fixed",
      "d" => "Deprecated",
      "r" => "Removed",
      "s" => "Security"
    }

    print "Type (a)dded, (c)hanged, (f)ixed, (d)eprecated, (r)emoved, (s)ecurity: "
    STDOUT.flush
    type = types[STDIN.gets.chomp]

    print "Description: "
    STDOUT.flush
    description = STDIN.gets.chomp

    print "Author: "
    STDOUT.flush
    author = STDIN.gets.chomp

    print "Issue: "
    STDOUT.flush
    issue = STDIN.gets.chomp

    print "Dependencies (comma seperated): "
    STDOUT.flush
    deps = STDIN.gets.chomp.split(',').map{|d| "  - #{d.chomp.lstrip}"}.join("\n")

    yaml = <<~YAML
    date: #{Time.now.strftime('%F')}
    type: #{type}
    description: #{description}
    author: #{author}
    issue: #{issue}
    dependencies:
    #{deps}
    YAML

    filename = "#{SecureRandom.uuid}.yml"
    path = "#{Allages.config.input_dir}/Unreleased/#{filename}"

    open("#{path}", 'w') do |f|
      f.puts yaml
    end
    puts "created new unreleased entry #{path}"
  end
new_version() click to toggle source
# File lib/allages.rb, line 92
def new_version
  print "Version name: "
  STDOUT.flush
  version = STDIN.gets.chomp
  dir = "#{Allages.config.input_dir}/#{version}"
  if File.directory?(dir)
    puts "version already exists"
    exit 1
  else
    FileUtils.mkdir_p(dir)
    puts "created directory #{dir} "
  end

  open("#{dir}/.meta.yml", 'w') do |f|
    f.puts META_TEMPLATE
  end
end