github_changelog_generator 1.15.0.pre.alpha → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/LICENSE +1 -1
- data/README.md +332 -275
- data/Rakefile +3 -4
- data/bin/git-generate-changelog +1 -1
- data/lib/github_changelog_generator.rb +10 -6
- data/lib/github_changelog_generator/generator/entry.rb +218 -0
- data/lib/github_changelog_generator/generator/generator.rb +126 -104
- data/lib/github_changelog_generator/generator/generator_fetcher.rb +139 -23
- data/lib/github_changelog_generator/generator/generator_processor.rb +59 -27
- data/lib/github_changelog_generator/generator/generator_tags.rb +26 -22
- data/lib/github_changelog_generator/generator/section.rb +124 -0
- data/lib/github_changelog_generator/helper.rb +1 -1
- data/lib/github_changelog_generator/octo_fetcher.rb +261 -130
- data/lib/github_changelog_generator/options.rb +74 -1
- data/lib/github_changelog_generator/parser.rb +120 -176
- data/lib/github_changelog_generator/parser_file.rb +8 -3
- data/lib/github_changelog_generator/reader.rb +2 -2
- data/lib/github_changelog_generator/task.rb +5 -6
- data/lib/github_changelog_generator/version.rb +1 -1
- data/man/git-generate-changelog.1 +144 -45
- data/man/git-generate-changelog.1.html +157 -84
- data/man/git-generate-changelog.html +19 -7
- data/man/git-generate-changelog.md +151 -84
- data/spec/files/github-changelog-generator.md +114 -114
- data/spec/{install-gem-in-bundler.gemfile → install_gem_in_bundler.gemfile} +2 -0
- data/spec/spec_helper.rb +2 -6
- data/spec/unit/generator/entry_spec.rb +766 -0
- data/spec/unit/generator/generator_processor_spec.rb +103 -41
- data/spec/unit/generator/generator_spec.rb +47 -0
- data/spec/unit/generator/generator_tags_spec.rb +56 -24
- data/spec/unit/generator/section_spec.rb +34 -0
- data/spec/unit/octo_fetcher_spec.rb +247 -197
- data/spec/unit/options_spec.rb +28 -4
- data/spec/unit/parse_file_spec.rb +2 -2
- data/spec/unit/parser_spec.rb +0 -79
- data/spec/unit/reader_spec.rb +4 -4
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_commits/when_API_is_valid/returns_commits.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_commits_before/when_API_is_valid/returns_commits.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_issue_with_proper_key/values.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_issues.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_issues_with_labels.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_pull_request_with_proper_key/values.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_pull_requests_with_labels.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_pull_requests/when_API_call_is_valid.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_pull_requests/when_API_call_is_valid/returns_correct_pull_request_keys.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_pull_requests/when_API_call_is_valid/returns_pull_requests.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_commit/when_API_call_is_valid.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_commit/when_API_call_is_valid/returns_commit.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_date_of_tag/when_API_call_is_valid.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_date_of_tag/when_API_call_is_valid/returns_date.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_events_async/when_API_call_is_valid.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_events_async/when_API_call_is_valid/populates_issues.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_API_call_is_valid.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_API_call_is_valid/should_return_tags.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_API_call_is_valid/should_return_tags_count.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_wrong_token_provided.json +1 -1
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_wrong_token_provided/should_raise_Unauthorized_error.json +1 -1
- metadata +71 -38
- data/bin/ghclgen +0 -5
- data/lib/github_changelog_generator/generator/generator_generation.rb +0 -180
- data/spec/unit/generator/generator_generation_spec.rb +0 -17
data/bin/ghclgen
DELETED
@@ -1,180 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module GitHubChangelogGenerator
|
4
|
-
class Generator
|
5
|
-
# Main function to start change log generation
|
6
|
-
#
|
7
|
-
# @return [String] Generated change log file
|
8
|
-
def compound_changelog
|
9
|
-
fetch_and_filter_tags
|
10
|
-
fetch_issues_and_pr
|
11
|
-
|
12
|
-
log = ""
|
13
|
-
log += options[:frontmatter] if options[:frontmatter]
|
14
|
-
log += "#{options[:header]}\n\n"
|
15
|
-
|
16
|
-
log += if options[:unreleased_only]
|
17
|
-
generate_log_between_tags(filtered_tags[0], nil)
|
18
|
-
else
|
19
|
-
generate_log_for_all_tags
|
20
|
-
end
|
21
|
-
|
22
|
-
log += File.read(options[:base]) if File.file?(options[:base])
|
23
|
-
|
24
|
-
credit_line = "\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
|
25
|
-
log.gsub!(credit_line, "") # Remove old credit lines
|
26
|
-
log += credit_line
|
27
|
-
|
28
|
-
@log = log
|
29
|
-
end
|
30
|
-
|
31
|
-
# @param [Array] issues List of issues on sub-section
|
32
|
-
# @param [String] prefix Name of sub-section
|
33
|
-
# @return [String] Generate ready-to-go sub-section
|
34
|
-
def generate_sub_section(issues, prefix)
|
35
|
-
log = ""
|
36
|
-
|
37
|
-
if issues.any?
|
38
|
-
log += "#{prefix}\n\n" unless options[:simple_list]
|
39
|
-
issues.each do |issue|
|
40
|
-
merge_string = get_string_for_issue(issue)
|
41
|
-
log += "- #{merge_string}\n"
|
42
|
-
end
|
43
|
-
log += "\n"
|
44
|
-
end
|
45
|
-
log
|
46
|
-
end
|
47
|
-
|
48
|
-
# It generate one header for section with specific parameters.
|
49
|
-
#
|
50
|
-
# @param [String] newer_tag_name - name of newer tag
|
51
|
-
# @param [String] newer_tag_link - used for links. Could be same as #newer_tag_name or some specific value, like HEAD
|
52
|
-
# @param [Time] newer_tag_time - time, when newer tag created
|
53
|
-
# @param [String] older_tag_link - tag name, used for links.
|
54
|
-
# @param [String] project_url - url for current project.
|
55
|
-
# @return [String] - Generate one ready-to-add section.
|
56
|
-
def generate_header(newer_tag_name, newer_tag_link, newer_tag_time, older_tag_link, project_url)
|
57
|
-
log = ""
|
58
|
-
|
59
|
-
# Generate date string:
|
60
|
-
time_string = newer_tag_time.strftime(options[:date_format])
|
61
|
-
|
62
|
-
# Generate tag name and link
|
63
|
-
release_url = if options[:release_url]
|
64
|
-
format(options[:release_url], newer_tag_link)
|
65
|
-
else
|
66
|
-
"#{project_url}/tree/#{newer_tag_link}"
|
67
|
-
end
|
68
|
-
log += if newer_tag_name.equal?(options[:unreleased_label])
|
69
|
-
"## [#{newer_tag_name}](#{release_url})\n\n"
|
70
|
-
else
|
71
|
-
"## [#{newer_tag_name}](#{release_url}) (#{time_string})\n\n"
|
72
|
-
end
|
73
|
-
|
74
|
-
if options[:compare_link] && older_tag_link
|
75
|
-
# Generate compare link
|
76
|
-
log += "[Full Changelog](#{project_url}/compare/#{older_tag_link}...#{newer_tag_link})\n\n"
|
77
|
-
end
|
78
|
-
|
79
|
-
log
|
80
|
-
end
|
81
|
-
|
82
|
-
# Generate log only between 2 specified tags
|
83
|
-
# @param [String] older_tag all issues before this tag date will be excluded. May be nil, if it's first tag
|
84
|
-
# @param [String] newer_tag all issue after this tag will be excluded. May be nil for unreleased section
|
85
|
-
def generate_log_between_tags(older_tag, newer_tag)
|
86
|
-
filtered_issues, filtered_pull_requests = filter_issues_for_tags(newer_tag, older_tag)
|
87
|
-
|
88
|
-
if newer_tag.nil? && filtered_issues.empty? && filtered_pull_requests.empty?
|
89
|
-
# do not generate empty unreleased section
|
90
|
-
return ""
|
91
|
-
end
|
92
|
-
|
93
|
-
create_log_for_tag(filtered_pull_requests, filtered_issues, newer_tag, older_tag)
|
94
|
-
end
|
95
|
-
|
96
|
-
# Filters issues and pull requests based on, respectively, `closed_at` and `merged_at`
|
97
|
-
# timestamp fields.
|
98
|
-
#
|
99
|
-
# @return [Array] filtered issues and pull requests
|
100
|
-
def filter_issues_for_tags(newer_tag, older_tag)
|
101
|
-
filtered_pull_requests = delete_by_time(@pull_requests, "merged_at", older_tag, newer_tag)
|
102
|
-
filtered_issues = delete_by_time(@issues, "closed_at", older_tag, newer_tag)
|
103
|
-
|
104
|
-
newer_tag_name = newer_tag.nil? ? nil : newer_tag["name"]
|
105
|
-
|
106
|
-
if options[:filter_issues_by_milestone]
|
107
|
-
# delete excess irrelevant issues (according milestones). Issue #22.
|
108
|
-
filtered_issues = filter_by_milestone(filtered_issues, newer_tag_name, @issues)
|
109
|
-
filtered_pull_requests = filter_by_milestone(filtered_pull_requests, newer_tag_name, @pull_requests)
|
110
|
-
end
|
111
|
-
[filtered_issues, filtered_pull_requests]
|
112
|
-
end
|
113
|
-
|
114
|
-
# The full cycle of generation for whole project
|
115
|
-
# @return [String] The complete change log
|
116
|
-
def generate_log_for_all_tags
|
117
|
-
puts "Generating log..." if options[:verbose]
|
118
|
-
|
119
|
-
log = generate_unreleased_section
|
120
|
-
|
121
|
-
@tag_section_mapping.each_pair do |_tag_section, left_right_tags|
|
122
|
-
older_tag, newer_tag = left_right_tags
|
123
|
-
log += generate_log_between_tags(older_tag, newer_tag)
|
124
|
-
end
|
125
|
-
|
126
|
-
log
|
127
|
-
end
|
128
|
-
|
129
|
-
def generate_unreleased_section
|
130
|
-
log = ""
|
131
|
-
if options[:unreleased]
|
132
|
-
start_tag = filtered_tags[0] || sorted_tags.last
|
133
|
-
unreleased_log = generate_log_between_tags(start_tag, nil)
|
134
|
-
log += unreleased_log if unreleased_log
|
135
|
-
end
|
136
|
-
log
|
137
|
-
end
|
138
|
-
|
139
|
-
# Parse issue and generate single line formatted issue line.
|
140
|
-
#
|
141
|
-
# Example output:
|
142
|
-
# - Add coveralls integration [\#223](https://github.com/skywinder/github-changelog-generator/pull/223) (@skywinder)
|
143
|
-
#
|
144
|
-
# @param [Hash] issue Fetched issue from GitHub
|
145
|
-
# @return [String] Markdown-formatted single issue
|
146
|
-
def get_string_for_issue(issue)
|
147
|
-
encapsulated_title = encapsulate_string issue["title"]
|
148
|
-
|
149
|
-
title_with_number = "#{encapsulated_title} [\\##{issue['number']}](#{issue['html_url']})"
|
150
|
-
if options[:issue_line_labels].present?
|
151
|
-
title_with_number = "#{title_with_number}#{line_labels_for(issue)}"
|
152
|
-
end
|
153
|
-
issue_line_with_user(title_with_number, issue)
|
154
|
-
end
|
155
|
-
|
156
|
-
private
|
157
|
-
|
158
|
-
def line_labels_for(issue)
|
159
|
-
labels = if options[:issue_line_labels] == ["ALL"]
|
160
|
-
issue["labels"]
|
161
|
-
else
|
162
|
-
issue["labels"].select { |label| options[:issue_line_labels].include?(label["name"]) }
|
163
|
-
end
|
164
|
-
labels.map { |label| " \[[#{label['name']}](#{label['url'].sub('api.github.com/repos', 'github.com')})\]" }.join("")
|
165
|
-
end
|
166
|
-
|
167
|
-
def issue_line_with_user(line, issue)
|
168
|
-
return line if !options[:author] || issue["pull_request"].nil?
|
169
|
-
|
170
|
-
user = issue["user"]
|
171
|
-
return "#{line} ({Null user})" unless user
|
172
|
-
|
173
|
-
if options[:usernames_as_github_logins]
|
174
|
-
"#{line} (@#{user['login']})"
|
175
|
-
else
|
176
|
-
"#{line} ([#{user['login']}](#{user['html_url']}))"
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module GitHubChangelogGenerator
|
4
|
-
describe Generator do
|
5
|
-
describe "#get_string_for_issue" do
|
6
|
-
let(:issue) do
|
7
|
-
{ "title" => "Bug in code" }
|
8
|
-
end
|
9
|
-
|
10
|
-
it "formats an issue according to options" do
|
11
|
-
expect do
|
12
|
-
described_class.new.get_string_for_issue(issue)
|
13
|
-
end.not_to raise_error
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|