module GitHubChangelogGenerator class Generator # A Generator responsible for all logic, related with change log generation from ready-to-parse issues # # Example: # generator = GitHubChangelogGenerator::Generator.new # content = generator.compound_changelog def initialize(options = nil) @options = options end # Parse issue and generate single line formatted issue line. # # Example output: # - Add coveralls integration [\#223](https://github.com/skywinder/github-changelog-generator/pull/223) ([skywinder](https://github.com/skywinder)) # # @param [Hash] issue Fetched issue from GitHub # @return [String] Markdown-formatted single issue def get_string_for_issue(issue) encapsulated_title = encapsulate_string issue[:title] title_with_number = "#{encapsulated_title} [\\##{issue[:number]}](#{issue.html_url})" unless issue.pull_request.nil? if @options[:author] if issue.user.nil? title_with_number += " ({Null user})" else title_with_number += " ([#{issue.user.login}](#{issue.user.html_url}))" end end end title_with_number end # Encapsulate characters to make markdown look as expected. # # @param [String] string # @return [String] encapsulated input string def encapsulate_string(string) string.gsub! '\\', '\\\\' encpas_chars = %w(> * _ \( \) [ ] #) encpas_chars.each do |char| string.gsub! char, "\\#{char}" end string end # Main function to start change log generation # # @return [String] Generated change log file def compound_changelog log = "# Change Log\n\n" if @options[:unreleased_only] log += generate_log_between_tags(all_tags[0], nil) elsif @options[:tag1] and @options[:tag2] tag1 = @options[:tag1] tag2 = @options[:tag2] tags_strings = [] all_tags.each { |x| tags_strings.push(x["name"]) } if tags_strings.include?(tag1) if tags_strings.include?(tag2) to_a = tags_strings.map.with_index.to_a hash = Hash[to_a] index1 = hash[tag1] index2 = hash[tag2] log += generate_log_between_tags(all_tags[index1], all_tags[index2]) else fail ChangelogGeneratorError, "Can't find tag #{tag2} -> exit".red end else fail ChangelogGeneratorError, "Can't find tag #{tag1} -> exit".red end else log += generate_log_for_all_tags end log += "\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*" @log = log @log = log end # The full cycle of generation for whole project # @return [String] The complete change log def generate_log_for_all_tags fetch_tags_dates if @options[:verbose] puts "Sorting tags..." end @all_tags.sort_by! { |x| @fetcher.get_time_of_tag(x) }.reverse! if @options[:verbose] puts "Generating log..." end log = "" if @options[:unreleased] && @all_tags.count != 0 unreleased_log = generate_log_between_tags(all_tags[0], nil) if unreleased_log log += unreleased_log end end (1...all_tags.size).each { |index| log += generate_log_between_tags(all_tags[index], all_tags[index - 1]) } if @all_tags.count != 0 log += generate_log_between_tags(nil, all_tags.last) end log end end end