github_changelog_generator 1.15.2 → 1.16.4

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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -6
  3. data/Rakefile +1 -1
  4. data/lib/github_changelog_generator/argv_parser.rb +225 -0
  5. data/lib/github_changelog_generator/generator/entry.rb +10 -10
  6. data/lib/github_changelog_generator/generator/generator.rb +41 -19
  7. data/lib/github_changelog_generator/generator/generator_fetcher.rb +5 -9
  8. data/lib/github_changelog_generator/generator/generator_processor.rb +23 -20
  9. data/lib/github_changelog_generator/generator/generator_tags.rb +15 -9
  10. data/lib/github_changelog_generator/generator/section.rb +27 -7
  11. data/lib/github_changelog_generator/helper.rb +1 -1
  12. data/lib/github_changelog_generator/octo_fetcher.rb +196 -149
  13. data/lib/github_changelog_generator/options.rb +4 -0
  14. data/lib/github_changelog_generator/parser.rb +70 -248
  15. data/lib/github_changelog_generator/parser_file.rb +29 -14
  16. data/lib/github_changelog_generator/reader.rb +4 -2
  17. data/lib/github_changelog_generator/ssl_certs/cacert.pem +851 -1756
  18. data/lib/github_changelog_generator/task.rb +3 -2
  19. data/lib/github_changelog_generator/version.rb +1 -1
  20. data/man/git-generate-changelog.1 +46 -34
  21. data/man/git-generate-changelog.1.html +39 -31
  22. data/man/git-generate-changelog.html +19 -19
  23. data/man/git-generate-changelog.md +39 -31
  24. data/spec/files/config_example +5 -0
  25. data/spec/spec_helper.rb +1 -1
  26. data/spec/unit/generator/entry_spec.rb +37 -31
  27. data/spec/unit/generator/generator_processor_spec.rb +99 -44
  28. data/spec/unit/generator/generator_spec.rb +47 -0
  29. data/spec/unit/generator/generator_tags_spec.rb +46 -3
  30. data/spec/unit/generator/section_spec.rb +34 -0
  31. data/spec/unit/octo_fetcher_spec.rb +45 -5
  32. data/spec/unit/parser_spec.rb +50 -0
  33. data/spec/unit/reader_spec.rb +9 -0
  34. metadata +44 -23
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "github_changelog_generator/generator/generator"
4
+
5
+ RSpec.describe GitHubChangelogGenerator::Generator do
6
+ let(:header) { "# Changelog" }
7
+ let(:generator) { described_class.new({ header: header }) }
8
+ let(:content) do
9
+ <<~'BASE'
10
+ ## [1.3.10](https://github.com/xxx/yyy/tree/1.3.10) (2015-03-18)
11
+
12
+ [Full Changelog](https://github.com/xxx/yyy/compare/1.3.9...1.3.10)
13
+
14
+ **Fixed bugs:**
15
+
16
+
17
+ BASE
18
+ end
19
+ let(:footer) do
20
+ <<~CREDIT
21
+ \\* *This Changelog was automatically generated \
22
+ by [github_changelog_generator]\
23
+ (https://github.com/github-changelog-generator/github-changelog-generator)*
24
+ CREDIT
25
+ end
26
+
27
+ context "when the given base file has previously appended template messages" do
28
+ describe "#remove_old_fixed_string" do
29
+ it "removes old template headers and footers" do
30
+ log = +"#{header}\n\n#{header}\n#{header}#{content}\n\n#{footer}\n#{footer}#{footer}"
31
+
32
+ expect(generator.send(:remove_old_fixed_string, log)).to eq content
33
+ end
34
+ end
35
+ end
36
+
37
+ context "when plain contents string was given" do
38
+ describe "#insert_fixed_string" do
39
+ it "append template messages at header and footer" do
40
+ log = String.new(content)
41
+ ans = "#{header}\n\n#{content}\n\n#{footer}"
42
+
43
+ expect(generator.send(:insert_fixed_string, log)).to eq ans
44
+ end
45
+ end
46
+ end
47
+ end
@@ -13,6 +13,33 @@ describe GitHubChangelogGenerator::Generator do
13
13
  end
14
14
  end
15
15
 
16
+ describe "#detect_link_tag_time" do
17
+ let(:newer_tag) { nil }
18
+
19
+ let(:default_options) { GitHubChangelogGenerator::Parser.default_options.merge(verbose: false) }
20
+ let(:options) do
21
+ {
22
+ future_release: "2.0.0"
23
+ }
24
+ end
25
+ let(:generator) { described_class.new(default_options.merge(options)) }
26
+
27
+ subject do
28
+ generator.detect_link_tag_time(newer_tag)
29
+ end
30
+
31
+ context "When the local date is not the same as the UTC date" do
32
+ before do
33
+ # 2020-12-27T17:00:00-10:00 is 2020-12-28T03:00:00Z.
34
+ # GitHub API date & time use UTC, so this instant when converted as a
35
+ # date should be 2020-12-28.
36
+ expect(Time).to receive(:new).and_return(Time.new(2020, 12, 27, 17, 0, 0, "-10:00"))
37
+ end
38
+
39
+ it { is_expected.to eq(["2.0.0", "2.0.0", Time.gm(2020, 12, 28, 3)]) }
40
+ end
41
+ end
42
+
16
43
  describe "#tag_section_mapping" do
17
44
  let(:all_tags) { tags_from_strings(%w[8 7 6 5 4 3 2 1]) }
18
45
  let(:sorted_tags) { all_tags }
@@ -57,10 +84,10 @@ describe GitHubChangelogGenerator::Generator do
57
84
  shared_examples_for "a changelog with some exclusions" do
58
85
  let(:expected_mapping) do
59
86
  {
60
- tag_with_name("8") => [tag_with_name("7"), tag_with_name("8")],
61
- tag_with_name("6") => [tag_with_name("5"), tag_with_name("6")],
87
+ tag_with_name("8") => [tag_with_name("6"), tag_with_name("8")],
88
+ tag_with_name("6") => [tag_with_name("4"), tag_with_name("6")],
62
89
  tag_with_name("4") => [tag_with_name("3"), tag_with_name("4")],
63
- tag_with_name("3") => [tag_with_name("2"), tag_with_name("3")],
90
+ tag_with_name("3") => [tag_with_name("1"), tag_with_name("3")],
64
91
  tag_with_name("1") => [nil, tag_with_name("1")]
65
92
  }
66
93
  end
@@ -130,6 +157,22 @@ describe GitHubChangelogGenerator::Generator do
130
157
  end
131
158
  end
132
159
 
160
+ describe "#filter_included_tags_regex" do
161
+ subject { generator.filter_included_tags(tags_from_strings(%w[1 2 3])) }
162
+
163
+ context "with matching regex" do
164
+ let(:generator) { GitHubChangelogGenerator::Generator.new(include_tags_regex: "[23]") }
165
+ it { is_expected.to be_a Array }
166
+ it { is_expected.to match_array(tags_from_strings(%w[2 3])) }
167
+ end
168
+
169
+ context "with non-matching regex" do
170
+ let(:generator) { GitHubChangelogGenerator::Generator.new(include_tags_regex: "[45]") }
171
+ it { is_expected.to be_a Array }
172
+ it { is_expected.to match_array(tags_from_strings(%w[])) }
173
+ end
174
+ end
175
+
133
176
  describe "#filter_excluded_tags" do
134
177
  subject { generator.filter_excluded_tags(tags_from_strings(%w[1 2 3])) }
135
178
 
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GitHubChangelogGenerator
4
+ RSpec.describe Section do
5
+ let(:options) { {} }
6
+ subject(:section) { described_class.new(options) }
7
+
8
+ describe "#encapsulate_string" do
9
+ let(:string) { "" }
10
+
11
+ context "with the empty string" do
12
+ it "returns the string" do
13
+ expect(section.send(:encapsulate_string, string)).to eq string
14
+ end
15
+ end
16
+
17
+ context "with a string with an escape-needing character in it" do
18
+ let(:string) { "<Inside> and outside" }
19
+
20
+ it "returns the string escaped" do
21
+ expect(section.send(:encapsulate_string, string)).to eq '\\<Inside\\> and outside'
22
+ end
23
+ end
24
+
25
+ context "with a backticked string with an escape-needing character in it" do
26
+ let(:string) { 'back `\` slash' }
27
+
28
+ it "returns the string" do
29
+ expect(section.send(:encapsulate_string, string)).to eq 'back `\` slash'
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -29,9 +29,6 @@ describe GitHubChangelogGenerator::OctoFetcher do
29
29
 
30
30
  context "when raises Octokit::Forbidden" do
31
31
  it "sleeps and retries and then aborts" do
32
- retry_limit = GitHubChangelogGenerator::OctoFetcher::MAX_FORBIDDEN_RETRIES - 1
33
- allow(fetcher).to receive(:sleep_base_interval).exactly(retry_limit).times.and_return(0)
34
-
35
32
  expect(fetcher).to receive(:sys_abort).with("Exceeded retry limit")
36
33
  fetcher.send(:check_github_response) { raise(Octokit::Forbidden) }
37
34
  end
@@ -85,6 +82,49 @@ describe GitHubChangelogGenerator::OctoFetcher do
85
82
  end
86
83
  end
87
84
 
85
+ describe "#fetch_tag_shas" do
86
+ let(:commits) do
87
+ [
88
+ { sha: "0", parents: [{ sha: "1" }, { sha: "6" }] },
89
+ { sha: "1", parents: [{ sha: "2" }] },
90
+ { sha: "2", parents: [{ sha: "3" }] },
91
+ { sha: "3", parents: [{ sha: "4" }] },
92
+ { sha: "4", parents: [{ sha: "5" }] },
93
+ { sha: "5", parents: [] },
94
+ { sha: "6", parents: [{ sha: "7" }, { sha: "8" }] },
95
+ { sha: "7", parents: [{ sha: "9" }, { sha: "10" }] },
96
+ { sha: "8", parents: [{ sha: "11" }, { sha: "12" }] },
97
+ { sha: "9", parents: [] },
98
+ { sha: "10", parents: [] },
99
+ { sha: "11", parents: [] },
100
+ { sha: "12", parents: [] }
101
+ ]
102
+ end
103
+
104
+ let(:tag0) { { "name" => "tag-0", "commit" => { "sha" => "0" } } }
105
+ let(:tag1) { { "name" => "tag-1", "commit" => { "sha" => "1" } } }
106
+ let(:tag6) { { "name" => "tag-6", "commit" => { "sha" => "6" } } }
107
+
108
+ before do
109
+ allow(fetcher).to receive(:commits).and_return(commits)
110
+ end
111
+
112
+ it "should find all shas with single parents" do
113
+ fetcher.fetch_tag_shas([tag1])
114
+ expect(tag1["shas_in_tag"]).to eq(Set.new(%w[1 2 3 4 5]))
115
+ end
116
+
117
+ it "should find all shas with multiple parents" do
118
+ fetcher.fetch_tag_shas([tag6])
119
+ expect(tag6["shas_in_tag"]).to eq(Set.new(%w[6 7 8 9 10 11 12]))
120
+ end
121
+
122
+ it "should find all shas with mixed parents" do
123
+ fetcher.fetch_tag_shas([tag0])
124
+ expect(tag0["shas_in_tag"]).to eq(Set.new(%w[0 1 2 3 4 5 6 7 8 9 10 11 12]))
125
+ end
126
+ end
127
+
88
128
  describe "#github_fetch_tags" do
89
129
  context "when wrong token provided", :vcr do
90
130
  let(:options) do
@@ -207,7 +247,7 @@ describe GitHubChangelogGenerator::OctoFetcher do
207
247
 
208
248
  # Convert times to Time
209
249
  expected_issue.each_pair do |k, v|
210
- expected_issue[k] = Time.parse(v) if v.to_s =~ /^2015-/
250
+ expected_issue[k] = Time.parse(v) if v.to_s.start_with?("2015-")
211
251
  end
212
252
 
213
253
  expect(issues.first).to eq(expected_issue)
@@ -269,7 +309,7 @@ describe GitHubChangelogGenerator::OctoFetcher do
269
309
 
270
310
  # Convert times to Time
271
311
  expected_pr.each_pair do |k, v|
272
- expected_pr[k] = Time.parse(v) if v.to_s =~ /^2016-01/
312
+ expected_pr[k] = Time.parse(v) if v.to_s.start_with?("2016-01")
273
313
  end
274
314
 
275
315
  expect(pull_requests.first).to eq(expected_pr)
@@ -1,4 +1,54 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  describe GitHubChangelogGenerator::Parser do
4
+ let(:argv) { [] }
5
+
6
+ before do
7
+ # Calling abort will abort the test run, allow calls to abort to not accidentaly get positive falses
8
+ allow(Kernel).to receive(:abort)
9
+ end
10
+
11
+ describe ".parse_options" do
12
+ context "when required arguments are given" do
13
+ let(:argv) { ["--user", "the user", "--project", "the_project"] }
14
+
15
+ it "executes and prints the configuration" do
16
+ expect { described_class.parse_options(argv) }.to output(/config_file=>".github_changelog_generator"/).to_stdout
17
+ end
18
+ end
19
+
20
+ context "when --config-file is overridden to something that is not there" do
21
+ let(:argv) { ["--config-file", "does_not_exist"] }
22
+
23
+ it "aborts the execution" do
24
+ expect(Kernel).to receive(:abort)
25
+ expect { described_class.parse_options(argv) }.to output(/Configure which user and project to work on./).to_stderr
26
+ end
27
+ end
28
+
29
+ context "when an option with incorrect type is given" do
30
+ let(:argv) { ["--max-issues", "X"] }
31
+
32
+ it "aborts the execution with error message from parser" do
33
+ expect(Kernel).to receive(:abort)
34
+ expect { described_class.parse_options(argv) }.to output(/invalid argument: --max-issues X/).to_stderr
35
+ end
36
+ end
37
+
38
+ context "when path to configuration file is given" do
39
+ let(:argv) { ["--config-file", File.join(__dir__, "..", "files", "config_example")] }
40
+
41
+ it "uses the values from the configuration file" do
42
+ expect { described_class.parse_options(argv) }.to output(/spec_project/).to_stdout
43
+ end
44
+ end
45
+
46
+ context "when configuration file and parameters are given" do
47
+ let(:argv) { ["--project", "stronger_project", "--config-file", File.join(__dir__, "..", "files", "config_example")] }
48
+
49
+ it "uses the values from the arguments" do
50
+ expect { described_class.parse_options(argv) }.to output(/stronger_project/).to_stdout
51
+ end
52
+ end
53
+ end
4
54
  end
@@ -38,6 +38,15 @@ describe GitHubChangelogGenerator::Reader do
38
38
  it { is_expected.to include("url" => "https://github.com/github-changelog-generator/Github-Changelog-Generator/tree/1.3.10") }
39
39
  it { is_expected.to include("date" => "2015-03-18") }
40
40
  end
41
+ context "when given a named link" do
42
+ subject { @reader.parse_heading("## [1.3.10]") }
43
+ it { is_expected.to include("version" => "1.3.10") }
44
+ end
45
+ context "when given a named link with date" do
46
+ subject { @reader.parse_heading("## [1.3.10] (2015-03-18)") }
47
+ it { is_expected.to include("version" => "1.3.10") }
48
+ it { is_expected.to include("date" => "2015-03-18") }
49
+ end
41
50
  context "when no url and date is provided" do
42
51
  subject { @reader.parse_heading("## foobar") }
43
52
  it { is_expected.to include("version" => "foobar", "url" => nil, "date" => nil) }
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github_changelog_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.15.2
4
+ version: 1.16.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Petr Korolev
8
8
  - Olle Jonsson
9
9
  - Marco Ferrari
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-04-07 00:00:00.000000000 Z
13
+ date: 2021-06-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -26,6 +26,34 @@ dependencies:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: async
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 1.25.0
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.25.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: async-http-faraday
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
29
57
  - !ruby/object:Gem::Dependency
30
58
  name: faraday-http-cache
31
59
  requirement: !ruby/object:Gem::Requirement
@@ -96,23 +124,9 @@ dependencies:
96
124
  - - ">="
97
125
  - !ruby/object:Gem::Version
98
126
  version: '10.0'
99
- - !ruby/object:Gem::Dependency
100
- name: retriable
101
- requirement: !ruby/object:Gem::Requirement
102
- requirements:
103
- - - "~>"
104
- - !ruby/object:Gem::Version
105
- version: '3.0'
106
- type: :runtime
107
- prerelease: false
108
- version_requirements: !ruby/object:Gem::Requirement
109
- requirements:
110
- - - "~>"
111
- - !ruby/object:Gem::Version
112
- version: '3.0'
113
127
  description: Changelog generation has never been so easy. Fully automate changelog
114
128
  generation - this gem generate changelog file based on tags, issues and merged pull
115
- requests from Github issue tracker.
129
+ requests from GitHub.
116
130
  email: sky4winder+github_changelog_generator@gmail.com
117
131
  executables:
118
132
  - git-generate-changelog
@@ -126,6 +140,7 @@ files:
126
140
  - bin/git-generate-changelog
127
141
  - bin/github_changelog_generator
128
142
  - lib/github_changelog_generator.rb
143
+ - lib/github_changelog_generator/argv_parser.rb
129
144
  - lib/github_changelog_generator/generator/entry.rb
130
145
  - lib/github_changelog_generator/generator/generator.rb
131
146
  - lib/github_changelog_generator/generator/generator_fetcher.rb
@@ -147,12 +162,15 @@ files:
147
162
  - man/git-generate-changelog.md
148
163
  - spec/files/angular.js.md
149
164
  - spec/files/bundler.md
165
+ - spec/files/config_example
150
166
  - spec/files/github-changelog-generator.md
151
167
  - spec/install_gem_in_bundler.gemfile
152
168
  - spec/spec_helper.rb
153
169
  - spec/unit/generator/entry_spec.rb
154
170
  - spec/unit/generator/generator_processor_spec.rb
171
+ - spec/unit/generator/generator_spec.rb
155
172
  - spec/unit/generator/generator_tags_spec.rb
173
+ - spec/unit/generator/section_spec.rb
156
174
  - spec/unit/octo_fetcher_spec.rb
157
175
  - spec/unit/options_spec.rb
158
176
  - spec/unit/parse_file_spec.rb
@@ -184,7 +202,7 @@ homepage: https://github.com/github-changelog-generator/Github-Changelog-Generat
184
202
  licenses:
185
203
  - MIT
186
204
  metadata: {}
187
- post_install_message:
205
+ post_install_message:
188
206
  rdoc_options: []
189
207
  require_paths:
190
208
  - lib
@@ -192,27 +210,30 @@ required_ruby_version: !ruby/object:Gem::Requirement
192
210
  requirements:
193
211
  - - ">="
194
212
  - !ruby/object:Gem::Version
195
- version: 2.3.0
213
+ version: 2.5.0
196
214
  required_rubygems_version: !ruby/object:Gem::Requirement
197
215
  requirements:
198
216
  - - ">="
199
217
  - !ruby/object:Gem::Version
200
218
  version: '0'
201
219
  requirements: []
202
- rubygems_version: 3.1.2
203
- signing_key:
220
+ rubygems_version: 3.2.7
221
+ signing_key:
204
222
  specification_version: 4
205
- summary: Script, that automatically generate changelog from your tags, issues, labels
223
+ summary: Script that automatically generates a changelog from your tags, issues, labels
206
224
  and pull requests.
207
225
  test_files:
208
226
  - spec/files/angular.js.md
209
227
  - spec/files/bundler.md
228
+ - spec/files/config_example
210
229
  - spec/files/github-changelog-generator.md
211
230
  - spec/install_gem_in_bundler.gemfile
212
231
  - spec/spec_helper.rb
213
232
  - spec/unit/generator/entry_spec.rb
214
233
  - spec/unit/generator/generator_processor_spec.rb
234
+ - spec/unit/generator/generator_spec.rb
215
235
  - spec/unit/generator/generator_tags_spec.rb
236
+ - spec/unit/generator/section_spec.rb
216
237
  - spec/unit/octo_fetcher_spec.rb
217
238
  - spec/unit/options_spec.rb
218
239
  - spec/unit/parse_file_spec.rb