class Fog::Rake::ChangelogTask

Public Class Methods

new() click to toggle source
# File lib/tasks/changelog_task.rb, line 7
def initialize
  desc "Update the changelog since the last release"
  task(:changelog) do

    @changelog = []
    @changelog << release_header

    process_commits

    @changelog << "**MVP!** #{mvp}" if mvp
    @changelog << blank_line

    add_commits_to_changelog
    save_changelog
    ::Rake::Task[:github_release].invoke
  end
end

Private Instance Methods

add_commit_line() click to toggle source
# File lib/tasks/changelog_task.rb, line 84
def add_commit_line
  @current_line.gsub!(/^\[([^\]]*)\] /, '')
  tag = $1 || 'misc'
  @changes[tag] ||= []
  @changes[tag] << "#{@current_line} thanks #{@committer}"
end
add_commits_to_changelog() click to toggle source
# File lib/tasks/changelog_task.rb, line 55
def add_commits_to_changelog
  @changes.keys.sort.each do |tag|
    @changelog << "#### [#{tag}]"
    @changes[tag].each do |commit|
      @changelog << "*   #{commit}"
    end
    @changelog << blank_line
  end
end
add_committer() click to toggle source
# File lib/tasks/changelog_task.rb, line 95
def add_committer
  @committers[@committer] = 0
end
add_period_if_necessary() click to toggle source
# File lib/tasks/changelog_task.rb, line 157
def add_period_if_necessary
  @current_line << "." unless @current_line[-1] == '.'
end
blank_line() click to toggle source
# File lib/tasks/changelog_task.rb, line 51
def blank_line
  ''
end
collaborators() click to toggle source
# File lib/tasks/changelog_task.rb, line 183
def collaborators
  response = Excon.get('https://api.github.com/repos/fog/fog/collaborators', :headers => {'User-Agent' => 'geemus'})
  data = Fog::JSON.decode(response.body)
  data.length
end
committer_line?() click to toggle source
# File lib/tasks/changelog_task.rb, line 165
def committer_line?
  committer_match != nil
end
committer_match() click to toggle source
# File lib/tasks/changelog_task.rb, line 169
def committer_match
  @current_line.match /([\w\s]+)\s+\(\d+\)/
end
committers_sorted_by_commits() click to toggle source
# File lib/tasks/changelog_task.rb, line 99
def committers_sorted_by_commits
  committer_pairs = @committers.to_a.sort {|x,y| y[1] <=> x[1]}
  committer_pairs.reject! {|pair| pair.last < 1 }
  committer_pairs.map {|pair| pair.first }
end
downloads() click to toggle source
# File lib/tasks/changelog_task.rb, line 177
def downloads
  repsonse = Excon.get('https://rubygems.org/api/v1/gems/fog.json')
  data = Fog::JSON.decode(repsonse.body)
  data['downloads']
end
forks() click to toggle source
# File lib/tasks/changelog_task.rb, line 189
def forks
  repo_metadata['forks']
end
former_mvp?(committer) click to toggle source
# File lib/tasks/changelog_task.rb, line 105
def former_mvp?(committer)
   [
     'Aaron Suggs',
     'ller', #"Achim Ledermüller" UTF-8 fail?
     'Ash Wilson',
     'Benson Kalahar',
     'Brian Hartsock',
     'Chris Roberts',
     'Christopher Oliver',
     'Colin Hebert',
     'Daniel Reichert',
     'Decklin Foster',
     'Dylan Egan',
     'Erik Michaels-Ober',
     'Frederick Cheung',
     'geemus',
     'Henry Addison',
     'James Bence',
     'Kevin Menard',
     'Kevin Olbrich',
     'Kyle Rames',
     'Lincoln Stoll',
     'Luqman Amjad',
     'Michael Hale',
     'Michael Zeng',
     'Mike Hagedorn',
     'Mike Pountney',
     'Nat Welch',
     'Nick Osborn',
     'nightshade427',
     'Patrick Debois',
     'Paul Thornthwaite',
     'Paulo Henrique Lopes Ribeiro',
     'Peter Souter',
     'Rodrigo Estebanez',
     'Rupak Ganguly',
     'Stepan G. Fedorov',
     'Wesley Beary'
   ].include?(committer)
end
increment_commits() click to toggle source
# File lib/tasks/changelog_task.rb, line 91
def increment_commits
  @committers[@committer] += 1
end
last_release_sha() click to toggle source
# File lib/tasks/changelog_task.rb, line 173
def last_release_sha
  %x`cat changelog.md | head -2`.split(' ').last
end
mvp() click to toggle source
# File lib/tasks/changelog_task.rb, line 146
def mvp
  return @mvp if @mvp
  committers_sorted_by_commits.each do |committer|
    unless former_mvp?(committer)
      @mvp = committer
      return @mvp
    end
  end
  nil
end
open_issues() click to toggle source
# File lib/tasks/changelog_task.rb, line 193
def open_issues
  repo_metadata['open_issues']
end
process_commits() click to toggle source
# File lib/tasks/changelog_task.rb, line 65
def process_commits
  shortlog = %x`git shortlog #{last_release_sha}..HEAD`
  @changes = {}
  @committers = {}
  @committer = nil
  shortlog.split("\n").each do |line|
    @current_line = line
    if committer_line?
      @committer = committer_match[1]
      add_committer
    elsif !release_merge_line?
      add_period_if_necessary
      @current_line.lstrip!
      add_commit_line
      increment_commits
    end
  end
end
release_header() click to toggle source
# File lib/tasks/changelog_task.rb, line 27
      def release_header
        <<-HEREDOC
## #{Fog::VERSION} #{timestamp}
*Hash* #{sha}

Statistic     | Value
------------- | --------:
Collaborators | #{collaborators}
Downloads     | #{downloads}
Forks         | #{forks}
Open Issues   | #{open_issues}
Watchers      | #{watchers}
        HEREDOC
      end
release_merge_line?() click to toggle source
# File lib/tasks/changelog_task.rb, line 161
def release_merge_line?
  @current_line =~ /^\s*((Merge.*)|(Release.*))?$/
end
repo_metadata() click to toggle source
# File lib/tasks/changelog_task.rb, line 201
def repo_metadata
  return @repo_metadata if @repo_metadata
  response = Excon.get('https://api.github.com/repos/fog/fog', :headers => {'User-Agent' => 'geemus'})
  data = Fog::JSON.decode(response.body)
  @repo_metadata = data.select {|key, value| ['forks', 'open_issues', 'watchers'].include?(key)}
end
save_changelog() click to toggle source
# File lib/tasks/changelog_task.rb, line 42
def save_changelog
  old_changelog = File.read('CHANGELOG.md')
  File.open('CHANGELOG.md', 'w') do |file|
    file.write(@changelog.join("\n"))
    file.write("\n\n")
    file.write(old_changelog)
  end
end
sha() click to toggle source
# File lib/tasks/changelog_task.rb, line 208
def sha
  %x`git log | head -1`.split(' ').last
end
timestamp() click to toggle source
# File lib/tasks/changelog_task.rb, line 212
def timestamp
  @time ||= Time.now.utc.strftime('%m/%d/%Y')
end
watchers() click to toggle source
# File lib/tasks/changelog_task.rb, line 197
def watchers
  repo_metadata['watchers']
end