px_github_changelog_generator 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +9 -0
- data/README.md +357 -0
- data/Rakefile +19 -0
- data/bin/git-generate-changelog +5 -0
- data/bin/github_changelog_generator +5 -0
- data/lib/github_changelog_generator/argv_parser.rb +225 -0
- data/lib/github_changelog_generator/file_parser_chooser.rb +27 -0
- data/lib/github_changelog_generator/generator/entry.rb +218 -0
- data/lib/github_changelog_generator/generator/generator.rb +177 -0
- data/lib/github_changelog_generator/generator/generator_fetcher.rb +202 -0
- data/lib/github_changelog_generator/generator/generator_processor.rb +237 -0
- data/lib/github_changelog_generator/generator/generator_tags.rb +210 -0
- data/lib/github_changelog_generator/generator/section.rb +129 -0
- data/lib/github_changelog_generator/helper.rb +37 -0
- data/lib/github_changelog_generator/octo_fetcher.rb +535 -0
- data/lib/github_changelog_generator/options.rb +159 -0
- data/lib/github_changelog_generator/parser.rb +89 -0
- data/lib/github_changelog_generator/parser_file.rb +101 -0
- data/lib/github_changelog_generator/reader.rb +88 -0
- data/lib/github_changelog_generator/ssl_certs/cacert.pem +3138 -0
- data/lib/github_changelog_generator/task.rb +68 -0
- data/lib/github_changelog_generator/version.rb +5 -0
- data/lib/github_changelog_generator.rb +49 -0
- data/man/git-generate-changelog.1 +393 -0
- data/man/git-generate-changelog.1.html +359 -0
- data/man/git-generate-changelog.html +270 -0
- data/man/git-generate-changelog.md +274 -0
- data/spec/files/angular.js.md +9395 -0
- data/spec/files/bundler.md +1911 -0
- data/spec/files/config_example +5 -0
- data/spec/files/github-changelog-generator.md +305 -0
- data/spec/github_changelog_generator_spec.rb +32 -0
- data/spec/install_gem_in_bundler.gemfile +5 -0
- data/spec/spec_helper.rb +74 -0
- data/spec/unit/generator/entry_spec.rb +766 -0
- data/spec/unit/generator/generator_processor_spec.rb +203 -0
- data/spec/unit/generator/generator_spec.rb +47 -0
- data/spec/unit/generator/generator_tags_spec.rb +337 -0
- data/spec/unit/generator/section_spec.rb +43 -0
- data/spec/unit/octo_fetcher_spec.rb +590 -0
- data/spec/unit/options_spec.rb +67 -0
- data/spec/unit/parser_file_spec.rb +94 -0
- data/spec/unit/parser_spec.rb +54 -0
- data/spec/unit/reader_spec.rb +120 -0
- 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 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_issue_with_proper_key/values.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_issues.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_issues_with_labels.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_pull_request_with_proper_key/values.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid/returns_pull_requests_with_labels.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_issues_and_pr/when_API_call_is_valid.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_pull_requests/when_API_call_is_valid/returns_correct_pull_request_keys.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_pull_requests/when_API_call_is_valid/returns_pull_requests.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_closed_pull_requests/when_API_call_is_valid.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_commit/when_API_call_is_valid/returns_commit.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_commit/when_API_call_is_valid.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_date_of_tag/when_API_call_is_valid/returns_date.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_date_of_tag/when_API_call_is_valid.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_events_async/when_API_call_is_valid/populates_issues.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_fetch_events_async/when_API_call_is_valid.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_API_call_is_valid/should_return_tags.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_API_call_is_valid/should_return_tags_count.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_API_call_is_valid.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_wrong_token_provided/should_raise_Unauthorized_error.json +1 -0
- data/spec/vcr/GitHubChangelogGenerator_OctoFetcher/_github_fetch_tags/when_wrong_token_provided.json +1 -0
- metadata +250 -0
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe GitHubChangelogGenerator::ParserFile do
|
4
|
+
describe ".github_changelog_generator" do
|
5
|
+
let(:options) { {} }
|
6
|
+
let(:parser) { described_class.new(options, StringIO.new(file)) }
|
7
|
+
|
8
|
+
context "when the well-known default file does not exist" do
|
9
|
+
let(:parser) { described_class.new(options) }
|
10
|
+
|
11
|
+
subject { parser.parse! }
|
12
|
+
|
13
|
+
it { is_expected.to be_nil }
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when file is empty" do
|
17
|
+
let(:file) { "" }
|
18
|
+
|
19
|
+
it "does not change the options" do
|
20
|
+
expect { parser.parse! }.to_not(change { options })
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when file is incorrect" do
|
25
|
+
let(:file) do
|
26
|
+
<<~FILE.strip
|
27
|
+
unreleased_label=staging
|
28
|
+
unreleased: false
|
29
|
+
FILE
|
30
|
+
end
|
31
|
+
|
32
|
+
it { expect { parser.parse! }.to raise_error(/line #2/) }
|
33
|
+
end
|
34
|
+
|
35
|
+
context "allows empty lines and comments with semi-colon or pound sign" do
|
36
|
+
let(:file) do
|
37
|
+
"\n \n#{<<~REMAINING.strip}"
|
38
|
+
# Comment on first line
|
39
|
+
unreleased_label=staging
|
40
|
+
; Comment on third line
|
41
|
+
unreleased=false
|
42
|
+
REMAINING
|
43
|
+
end
|
44
|
+
|
45
|
+
it { expect { parser.parse! }.not_to raise_error }
|
46
|
+
end
|
47
|
+
|
48
|
+
context "when override default values" do
|
49
|
+
let(:default_options) { GitHubChangelogGenerator::Parser.default_options.merge(verbose: false) }
|
50
|
+
let(:options) { {}.merge(default_options) }
|
51
|
+
let(:options_before_change) { options.dup }
|
52
|
+
let(:file) do
|
53
|
+
<<~FILE.strip
|
54
|
+
unreleased_label=staging
|
55
|
+
unreleased=false
|
56
|
+
header==== Changelog ===
|
57
|
+
max_issues=123
|
58
|
+
simple-list=true
|
59
|
+
FILE
|
60
|
+
end
|
61
|
+
|
62
|
+
it "changes the options" do
|
63
|
+
expect { parser.parse! }.to change { options }
|
64
|
+
.from(options_before_change)
|
65
|
+
.to(options_before_change.merge(unreleased_label: "staging",
|
66
|
+
unreleased: false,
|
67
|
+
header: "=== Changelog ===",
|
68
|
+
max_issues: 123,
|
69
|
+
simple_list: true))
|
70
|
+
end
|
71
|
+
|
72
|
+
context "turns exclude-labels into an Array", bug: "#327" do
|
73
|
+
let(:file) do
|
74
|
+
<<~FILE
|
75
|
+
exclude-labels=73a91042-da6f-11e5-9335-1040f38d7f90,7adf83b4-da6f-11e5-ae18-1040f38d7f90
|
76
|
+
header_label=# My changelog
|
77
|
+
FILE
|
78
|
+
end
|
79
|
+
|
80
|
+
it "reads exclude_labels into an Array" do
|
81
|
+
expect { parser.parse! }.to change { options[:exclude_labels] }
|
82
|
+
.from(default_options[:exclude_labels])
|
83
|
+
.to(%w[73a91042-da6f-11e5-9335-1040f38d7f90 7adf83b4-da6f-11e5-ae18-1040f38d7f90])
|
84
|
+
end
|
85
|
+
|
86
|
+
it "translates given header_label into the :header option" do
|
87
|
+
expect { parser.parse! }.to change { options[:header] }
|
88
|
+
.from(default_options[:header])
|
89
|
+
.to("# My changelog")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
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
|
54
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Author:: Enrico Stahn <mail@enricostahn.com>
|
5
|
+
#
|
6
|
+
# Copyright 2014, Zanui, <engineering@zanui.com.au>
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
|
21
|
+
describe GitHubChangelogGenerator::Reader do
|
22
|
+
before(:all) do
|
23
|
+
@reader = GitHubChangelogGenerator::Reader.new
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#parse_heading" do
|
27
|
+
context "when heading is empty" do
|
28
|
+
subject { @reader.parse_heading("## ") }
|
29
|
+
it { is_expected.to be_a(Hash) }
|
30
|
+
it { is_expected.to include("version", "url", "date") }
|
31
|
+
it { is_expected.to include("version" => nil, "url" => nil, "date" => nil) }
|
32
|
+
# TODO: Doesn't work?
|
33
|
+
# it { is_expected.to have_all_string_keys }
|
34
|
+
end
|
35
|
+
context "when given version, url and date" do
|
36
|
+
subject { @reader.parse_heading("## [1.3.10](https://github.com/github-changelog-generator/Github-Changelog-Generator/tree/1.3.10) (2015-03-18)") }
|
37
|
+
it { is_expected.to include("version" => "1.3.10") }
|
38
|
+
it { is_expected.to include("url" => "https://github.com/github-changelog-generator/Github-Changelog-Generator/tree/1.3.10") }
|
39
|
+
it { is_expected.to include("date" => "2015-03-18") }
|
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
|
50
|
+
context "when no url and date is provided" do
|
51
|
+
subject { @reader.parse_heading("## foobar") }
|
52
|
+
it { is_expected.to include("version" => "foobar", "url" => nil, "date" => nil) }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#parse" do
|
57
|
+
context "when file is empty" do
|
58
|
+
subject { @reader.parse("") }
|
59
|
+
it { is_expected.to be_an(Array) }
|
60
|
+
it { is_expected.to be_empty }
|
61
|
+
end
|
62
|
+
context "when file has only the header" do
|
63
|
+
subject { @reader.parse("# Changelog") }
|
64
|
+
it { is_expected.to be_an(Array) }
|
65
|
+
it { is_expected.to be_empty }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "example CHANGELOG files" do
|
70
|
+
subject { @reader.read(File.expand_path(File.join(File.dirname(__FILE__), "..", "files", self.class.description))) }
|
71
|
+
context "github-changelog-generator.md" do
|
72
|
+
it { is_expected.to be_an(Array) }
|
73
|
+
it { is_expected.not_to be_empty }
|
74
|
+
it { expect(subject.count).to eq(28) }
|
75
|
+
it { expect(subject.first).to include("version" => "1.3.10") }
|
76
|
+
it { expect(subject.first).to include("url" => "https://github.com/github-changelog-generator/Github-Changelog-Generator/tree/1.3.10") }
|
77
|
+
it { expect(subject.first).to include("date" => "2015-03-18") }
|
78
|
+
it { expect(subject.first).to include("content") }
|
79
|
+
it "content should not be empty" do
|
80
|
+
expect(subject.first["content"]).not_to be_empty
|
81
|
+
end
|
82
|
+
end
|
83
|
+
context "bundler.md" do
|
84
|
+
it { is_expected.to be_an(Array) }
|
85
|
+
it { is_expected.not_to be_empty }
|
86
|
+
it { expect(subject.count).to eq(151) }
|
87
|
+
it { expect(subject.first).to include("version" => "1.9.1") }
|
88
|
+
it { expect(subject.first).to include("url" => nil) }
|
89
|
+
it { expect(subject.first).to include("date" => "2015-03-21") }
|
90
|
+
it { expect(subject.first).to include("content") }
|
91
|
+
it "content should not be empty" do
|
92
|
+
expect(subject.first["content"]).not_to be_empty
|
93
|
+
end
|
94
|
+
end
|
95
|
+
context "angular.js.md" do
|
96
|
+
it { is_expected.to be_an(Array) }
|
97
|
+
it { is_expected.not_to be_empty }
|
98
|
+
# it do
|
99
|
+
# pending('Implement heading_level for parser.')
|
100
|
+
# expect(subject.first).to include('version' => '1.4.0-beta.6 cookie-liberation')
|
101
|
+
# end
|
102
|
+
# it do
|
103
|
+
# pending('Implement heading_level for parser.')
|
104
|
+
# expect(subject.first).to include('url' => nil)
|
105
|
+
# end
|
106
|
+
# it do
|
107
|
+
# pending('Implement heading_level for parser.')
|
108
|
+
# expect(subject.first).to include('date' => '2015-03-17')
|
109
|
+
# end
|
110
|
+
# it do
|
111
|
+
# pending('Implement heading_level for parser.')
|
112
|
+
# expect(subject.first).to include('content')
|
113
|
+
# end
|
114
|
+
# it 'content should not be empty' do
|
115
|
+
# pending('Implement heading_level for parser.')
|
116
|
+
# expect(subject.first['content']).not_to be_empty
|
117
|
+
# end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|