reorganaize issues fetching in more clear way
This commit is contained in:
parent
3f076b3069
commit
b10707b259
|
@ -1,28 +1,28 @@
|
||||||
# This configuration was generated by `rubocop --auto-gen-config`
|
# This configuration was generated by `rubocop --auto-gen-config`
|
||||||
# on 2015-05-22 15:59:03 +0300 using RuboCop version 0.31.0.
|
# on 2015-05-22 17:34:14 +0300 using RuboCop version 0.31.0.
|
||||||
# The point is for the user to remove these configuration records
|
# The point is for the user to remove these configuration records
|
||||||
# one by one as the offenses are removed from the code base.
|
# one by one as the offenses are removed from the code base.
|
||||||
# Note that changes in the inspected code, or installation of new
|
# Note that changes in the inspected code, or installation of new
|
||||||
# versions of RuboCop, may require this file to be generated again.
|
# versions of RuboCop, may require this file to be generated again.
|
||||||
|
|
||||||
# Offense count: 17
|
# Offense count: 16
|
||||||
Metrics/AbcSize:
|
Metrics/AbcSize:
|
||||||
Max: 73
|
Max: 73
|
||||||
|
|
||||||
# Offense count: 2
|
# Offense count: 1
|
||||||
Metrics/BlockNesting:
|
Metrics/BlockNesting:
|
||||||
Max: 4
|
Max: 4
|
||||||
|
|
||||||
# Offense count: 3
|
# Offense count: 4
|
||||||
# Configuration parameters: CountComments.
|
# Configuration parameters: CountComments.
|
||||||
Metrics/ClassLength:
|
Metrics/ClassLength:
|
||||||
Max: 280
|
Max: 162
|
||||||
|
|
||||||
# Offense count: 5
|
# Offense count: 4
|
||||||
Metrics/CyclomaticComplexity:
|
Metrics/CyclomaticComplexity:
|
||||||
Max: 15
|
Max: 15
|
||||||
|
|
||||||
# Offense count: 23
|
# Offense count: 21
|
||||||
# Configuration parameters: CountComments.
|
# Configuration parameters: CountComments.
|
||||||
Metrics/MethodLength:
|
Metrics/MethodLength:
|
||||||
Max: 121
|
Max: 121
|
||||||
|
@ -31,7 +31,7 @@ Metrics/MethodLength:
|
||||||
Metrics/PerceivedComplexity:
|
Metrics/PerceivedComplexity:
|
||||||
Max: 18
|
Max: 18
|
||||||
|
|
||||||
# Offense count: 4
|
# Offense count: 2
|
||||||
Style/AccessorMethodName:
|
Style/AccessorMethodName:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ Style/Documentation:
|
||||||
Style/GuardClause:
|
Style/GuardClause:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
# Offense count: 2
|
# Offense count: 1
|
||||||
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
|
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
|
||||||
Style/Next:
|
Style/Next:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
|
@ -10,6 +10,7 @@ require_relative "github_changelog_generator/generator/generator"
|
||||||
require_relative "github_changelog_generator/version"
|
require_relative "github_changelog_generator/version"
|
||||||
require_relative "github_changelog_generator/reader"
|
require_relative "github_changelog_generator/reader"
|
||||||
|
|
||||||
|
# The main module, where placed all classes (now, at least)
|
||||||
module GitHubChangelogGenerator
|
module GitHubChangelogGenerator
|
||||||
# Main class and entry point for this script.
|
# Main class and entry point for this script.
|
||||||
class ChangelogGenerator
|
class ChangelogGenerator
|
||||||
|
|
|
@ -20,18 +20,35 @@ module GitHubChangelogGenerator
|
||||||
@options = options
|
@options = options
|
||||||
|
|
||||||
@fetcher = GitHubChangelogGenerator::Fetcher.new @options
|
@fetcher = GitHubChangelogGenerator::Fetcher.new @options
|
||||||
|
|
||||||
|
fetch_tags
|
||||||
|
|
||||||
|
fetch_issues_and_pr
|
||||||
|
end
|
||||||
|
|
||||||
|
def fetch_issues_and_pr
|
||||||
|
issues, pull_requests = @fetcher.fetch_closed_issues_and_pr
|
||||||
|
|
||||||
|
@pull_requests = @options[:pulls] ? get_filtered_pull_requests(pull_requests) : []
|
||||||
|
|
||||||
|
@issues = @options[:issues] ? get_filtered_issues(issues) : []
|
||||||
|
|
||||||
|
fetch_events_for_issues_and_pr
|
||||||
|
detect_actual_closed_dates(@issues + @pull_requests)
|
||||||
|
end
|
||||||
|
|
||||||
|
def fetch_tags
|
||||||
# @all_tags = get_filtered_tags
|
# @all_tags = get_filtered_tags
|
||||||
@all_tags = @fetcher.get_all_tags
|
@all_tags = @fetcher.get_all_tags
|
||||||
|
|
||||||
# TODO: refactor this double asssign of @issues and @pull_requests and move all logic in one method
|
fetch_tags_dates
|
||||||
@issues, @pull_requests = @fetcher.fetch_closed_issues_and_pr
|
sort_tags_by_date
|
||||||
|
end
|
||||||
|
|
||||||
@pull_requests = @options[:pulls] ? get_filtered_pull_requests : []
|
# Sort all tags by date
|
||||||
|
def sort_tags_by_date
|
||||||
@issues = @options[:issues] ? get_filtered_issues : []
|
puts "Sorting tags..." if @options[:verbose]
|
||||||
|
@all_tags.sort_by! { |x| @fetcher.get_time_of_tag(x) }.reverse!
|
||||||
fetch_event_for_issues_and_pr
|
|
||||||
detect_actual_closed_dates
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Encapsulate characters to make markdown look as expected.
|
# Encapsulate characters to make markdown look as expected.
|
||||||
|
|
|
@ -2,7 +2,7 @@ module GitHubChangelogGenerator
|
||||||
class Generator
|
class Generator
|
||||||
# Fetch event for issues and pull requests
|
# Fetch event for issues and pull requests
|
||||||
# @return [Array] array of fetched issues
|
# @return [Array] array of fetched issues
|
||||||
def fetch_event_for_issues_and_pr
|
def fetch_events_for_issues_and_pr
|
||||||
if @options[:verbose]
|
if @options[:verbose]
|
||||||
print "Fetching events for issues and PR: 0/#{@issues.count + @pull_requests.count}\r"
|
print "Fetching events for issues and PR: 0/#{@issues.count + @pull_requests.count}\r"
|
||||||
end
|
end
|
||||||
|
@ -37,28 +37,24 @@ module GitHubChangelogGenerator
|
||||||
end
|
end
|
||||||
|
|
||||||
# Find correct closed dates, if issues was closed by commits
|
# Find correct closed dates, if issues was closed by commits
|
||||||
def detect_actual_closed_dates
|
def detect_actual_closed_dates(issues)
|
||||||
print "Fetching closed dates for issues...\r" if @options[:verbose]
|
print "Fetching closed dates for issues...\r" if @options[:verbose]
|
||||||
|
|
||||||
|
# TODO: implement async fetching with slice!
|
||||||
threads = []
|
threads = []
|
||||||
|
|
||||||
@issues.each do |issue|
|
issues.each do |issue|
|
||||||
threads << Thread.new do
|
threads << Thread.new do
|
||||||
find_closed_date_by_commit(issue)
|
find_closed_date_by_commit(issue)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@pull_requests.each do |pull_request|
|
|
||||||
threads << Thread.new do
|
|
||||||
find_closed_date_by_commit(pull_request)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
threads.each(&:join)
|
threads.each(&:join)
|
||||||
|
|
||||||
puts "Fetching closed dates for issues: Done!" if @options[:verbose]
|
puts "Fetching closed dates for issues: Done!" if @options[:verbose]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Fill :actual_date parameter of specified issue by closed date of the commit, it it was closed by commit.
|
# Fill :actual_date parameter of specified issue by closed date of the commit, if it was closed by commit.
|
||||||
# @param [Hash] issue
|
# @param [Hash] issue
|
||||||
def find_closed_date_by_commit(issue)
|
def find_closed_date_by_commit(issue)
|
||||||
unless issue["events"].nil?
|
unless issue["events"].nil?
|
||||||
|
@ -67,22 +63,30 @@ module GitHubChangelogGenerator
|
||||||
# reverse! - to find latest closed event. (event goes in date order)
|
# reverse! - to find latest closed event. (event goes in date order)
|
||||||
issue["events"].reverse!.each do |event|
|
issue["events"].reverse!.each do |event|
|
||||||
if event[:event].eql? compare_string
|
if event[:event].eql? compare_string
|
||||||
if event[:commit_id].nil?
|
set_date_from_event(event, issue)
|
||||||
issue[:actual_date] = issue[:closed_at]
|
|
||||||
else
|
|
||||||
begin
|
|
||||||
commit = @fetcher.fetch_commit(event)
|
|
||||||
issue[:actual_date] = commit[:author][:date]
|
|
||||||
rescue
|
|
||||||
puts "Warning: Can't fetch commit #{event[:commit_id]}. It is probably referenced from another repo.".yellow
|
|
||||||
issue[:actual_date] = issue[:closed_at]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
# TODO: assert issues, that remain without 'actual_date' hash for some reason.
|
# TODO: assert issues, that remain without 'actual_date' hash for some reason.
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Set closed date from this issue
|
||||||
|
#
|
||||||
|
# @param [Hash] event
|
||||||
|
# @param [Hash] issue
|
||||||
|
def set_date_from_event(event, issue)
|
||||||
|
if event[:commit_id].nil?
|
||||||
|
issue[:actual_date] = issue[:closed_at]
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
commit = @fetcher.fetch_commit(event)
|
||||||
|
issue[:actual_date] = commit[:author][:date]
|
||||||
|
rescue
|
||||||
|
puts "Warning: Can't fetch commit #{event[:commit_id]}. It is probably referenced from another repo.".yellow
|
||||||
|
issue[:actual_date] = issue[:closed_at]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -109,20 +109,9 @@ module GitHubChangelogGenerator
|
||||||
# The full cycle of generation for whole project
|
# The full cycle of generation for whole project
|
||||||
# @return [String] The complete change log
|
# @return [String] The complete change log
|
||||||
def generate_log_for_all_tags
|
def generate_log_for_all_tags
|
||||||
fetch_tags_dates
|
|
||||||
|
|
||||||
puts "Sorting tags..." if @options[:verbose]
|
|
||||||
|
|
||||||
@all_tags.sort_by! { |x| @fetcher.get_time_of_tag(x) }.reverse!
|
|
||||||
|
|
||||||
puts "Generating log..." if @options[:verbose]
|
puts "Generating log..." if @options[:verbose]
|
||||||
|
|
||||||
log = ""
|
log = generate_unreleased_section
|
||||||
|
|
||||||
if @options[:unreleased] && @all_tags.count != 0
|
|
||||||
unreleased_log = generate_log_between_tags(all_tags[0], nil)
|
|
||||||
log += unreleased_log if unreleased_log
|
|
||||||
end
|
|
||||||
|
|
||||||
(1...all_tags.size).each do |index|
|
(1...all_tags.size).each do |index|
|
||||||
log += generate_log_between_tags(all_tags[index], all_tags[index - 1])
|
log += generate_log_between_tags(all_tags[index], all_tags[index - 1])
|
||||||
|
@ -134,6 +123,15 @@ module GitHubChangelogGenerator
|
||||||
log
|
log
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def generate_unreleased_section
|
||||||
|
log = ""
|
||||||
|
if @options[:unreleased] && @all_tags.count != 0
|
||||||
|
unreleased_log = generate_log_between_tags(all_tags[0], nil)
|
||||||
|
log += unreleased_log if unreleased_log
|
||||||
|
end
|
||||||
|
log
|
||||||
|
end
|
||||||
|
|
||||||
# Parse issue and generate single line formatted issue line.
|
# Parse issue and generate single line formatted issue line.
|
||||||
#
|
#
|
||||||
# Example output:
|
# Example output:
|
||||||
|
|
|
@ -85,45 +85,6 @@ module GitHubChangelogGenerator
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# This method fetches missing params for PR and filter them by specified options
|
|
||||||
# It include add all PR's with labels from @options[:include_labels] array
|
|
||||||
# And exclude all from :exclude_labels array.
|
|
||||||
# @return [Array] filtered PR's
|
|
||||||
def get_filtered_pull_requests
|
|
||||||
filter_merged_pull_requests
|
|
||||||
|
|
||||||
filtered_pull_requests = include_issues_by_labels(@pull_requests)
|
|
||||||
|
|
||||||
filtered_pull_requests = exclude_issues_by_labels(filtered_pull_requests)
|
|
||||||
|
|
||||||
if @options[:verbose]
|
|
||||||
puts "Filtered pull requests: #{filtered_pull_requests.count}"
|
|
||||||
end
|
|
||||||
|
|
||||||
filtered_pull_requests
|
|
||||||
end
|
|
||||||
|
|
||||||
# This method filter only merged PR and
|
|
||||||
# fetch missing required attributes for pull requests
|
|
||||||
# :merged_at - is a date, when issue PR was merged.
|
|
||||||
# More correct to use merged date, rather than closed date.
|
|
||||||
def filter_merged_pull_requests
|
|
||||||
print "Fetching merged dates...\r" if @options[:verbose]
|
|
||||||
pull_requests = @fetcher.fetch_closed_pull_requests
|
|
||||||
|
|
||||||
@pull_requests.each do |pr|
|
|
||||||
fetched_pr = pull_requests.find do |fpr|
|
|
||||||
fpr.number == pr.number
|
|
||||||
end
|
|
||||||
pr[:merged_at] = fetched_pr[:merged_at]
|
|
||||||
pull_requests.delete(fetched_pr)
|
|
||||||
end
|
|
||||||
|
|
||||||
@pull_requests.select! do |pr|
|
|
||||||
!pr[:merged_at].nil?
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Include issues with labels, specified in :include_labels
|
# Include issues with labels, specified in :include_labels
|
||||||
# @param [Array] issues to filter
|
# @param [Array] issues to filter
|
||||||
# @return [Array] filtered array of issues
|
# @return [Array] filtered array of issues
|
||||||
|
@ -159,16 +120,55 @@ module GitHubChangelogGenerator
|
||||||
filtered_tags
|
filtered_tags
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# General filtered function
|
||||||
|
#
|
||||||
|
# @param [Array] all_issues
|
||||||
|
# @return [Array] filtered issues
|
||||||
|
def filter_array_by_labels(all_issues)
|
||||||
|
filtered_issues = include_issues_by_labels(all_issues)
|
||||||
|
exclude_issues_by_labels(filtered_issues)
|
||||||
|
end
|
||||||
|
|
||||||
# Filter issues according labels
|
# Filter issues according labels
|
||||||
# @return [Array] Filtered issues
|
# @return [Array] Filtered issues
|
||||||
def get_filtered_issues
|
def get_filtered_issues(issues)
|
||||||
filtered_issues = include_issues_by_labels(@issues)
|
issues = filter_array_by_labels(issues)
|
||||||
|
puts "Filtered issues: #{issues.count}" if @options[:verbose]
|
||||||
|
issues
|
||||||
|
end
|
||||||
|
|
||||||
filtered_issues = exclude_issues_by_labels(filtered_issues)
|
# This method fetches missing params for PR and filter them by specified options
|
||||||
|
# It include add all PR's with labels from @options[:include_labels] array
|
||||||
|
# And exclude all from :exclude_labels array.
|
||||||
|
# @return [Array] filtered PR's
|
||||||
|
def get_filtered_pull_requests(pull_requests)
|
||||||
|
pull_requests = filter_array_by_labels(pull_requests)
|
||||||
|
pull_requests = filter_merged_pull_requests(pull_requests)
|
||||||
|
puts "Filtered pull requests: #{pull_requests.count}" if @options[:verbose]
|
||||||
|
pull_requests
|
||||||
|
end
|
||||||
|
|
||||||
puts "Filtered issues: #{filtered_issues.count}" if @options[:verbose]
|
# This method filter only merged PR and
|
||||||
|
# fetch missing required attributes for pull requests
|
||||||
|
# :merged_at - is a date, when issue PR was merged.
|
||||||
|
# More correct to use merged date, rather than closed date.
|
||||||
|
def filter_merged_pull_requests(pull_requests)
|
||||||
|
print "Fetching merged dates...\r" if @options[:verbose]
|
||||||
|
closed_pull_requests = @fetcher.fetch_closed_pull_requests
|
||||||
|
|
||||||
filtered_issues
|
pull_requests.each do |pr|
|
||||||
|
fetched_pr = closed_pull_requests.find do |fpr|
|
||||||
|
fpr.number == pr.number
|
||||||
|
end
|
||||||
|
pr[:merged_at] = fetched_pr[:merged_at]
|
||||||
|
closed_pull_requests.delete(fetched_pr)
|
||||||
|
end
|
||||||
|
|
||||||
|
pull_requests.select! do |pr|
|
||||||
|
!pr[:merged_at].nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
pull_requests
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user