github_changelog_generator 1.15.2 → 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 +4 -4
- data/README.md +3 -1
- data/Rakefile +1 -1
- data/lib/github_changelog_generator/generator/entry.rb +10 -10
- data/lib/github_changelog_generator/generator/generator.rb +41 -19
- data/lib/github_changelog_generator/generator/generator_fetcher.rb +2 -5
- data/lib/github_changelog_generator/generator/generator_processor.rb +21 -19
- data/lib/github_changelog_generator/generator/generator_tags.rb +15 -9
- data/lib/github_changelog_generator/generator/section.rb +27 -7
- data/lib/github_changelog_generator/helper.rb +1 -1
- data/lib/github_changelog_generator/octo_fetcher.rb +169 -124
- data/lib/github_changelog_generator/options.rb +3 -0
- data/lib/github_changelog_generator/parser.rb +12 -2
- data/lib/github_changelog_generator/parser_file.rb +1 -1
- data/lib/github_changelog_generator/reader.rb +2 -2
- data/lib/github_changelog_generator/task.rb +3 -2
- data/lib/github_changelog_generator/version.rb +1 -1
- data/man/git-generate-changelog.1 +15 -3
- data/man/git-generate-changelog.1.html +9 -1
- data/man/git-generate-changelog.md +8 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/generator/entry_spec.rb +37 -31
- data/spec/unit/generator/generator_processor_spec.rb +99 -44
- data/spec/unit/generator/generator_spec.rb +47 -0
- data/spec/unit/generator/generator_tags_spec.rb +46 -3
- data/spec/unit/generator/section_spec.rb +34 -0
- data/spec/unit/octo_fetcher_spec.rb +45 -2
- metadata +39 -7
@@ -37,6 +37,7 @@ module GitHubChangelogGenerator
|
|
37
37
|
exclude_tags
|
38
38
|
exclude_tags_regex
|
39
39
|
filter_issues_by_milestone
|
40
|
+
issues_of_open_milestones
|
40
41
|
frontmatter
|
41
42
|
future_release
|
42
43
|
github_endpoint
|
@@ -44,6 +45,7 @@ module GitHubChangelogGenerator
|
|
44
45
|
header
|
45
46
|
http_cache
|
46
47
|
include_labels
|
48
|
+
include_tags_regex
|
47
49
|
issue_prefix
|
48
50
|
issue_line_labels
|
49
51
|
issue_line_body
|
@@ -62,6 +64,7 @@ module GitHubChangelogGenerator
|
|
62
64
|
security_prefix
|
63
65
|
simple_list
|
64
66
|
since_tag
|
67
|
+
since_commit
|
65
68
|
ssl_ca_file
|
66
69
|
summary_labels
|
67
70
|
summary_prefix
|
@@ -37,7 +37,7 @@ module GitHubChangelogGenerator
|
|
37
37
|
def self.setup_parser(options)
|
38
38
|
OptionParser.new do |opts| # rubocop:disable Metrics/BlockLength
|
39
39
|
opts.banner = "Usage: github_changelog_generator --user USER --project PROJECT [options]"
|
40
|
-
opts.on("-u", "--user USER", "Username of the owner of target GitHub repo.") do |last|
|
40
|
+
opts.on("-u", "--user USER", "Username of the owner of the target GitHub repo OR the namespace of target Github repo if owned by an organization.") do |last|
|
41
41
|
options[:user] = last
|
42
42
|
end
|
43
43
|
opts.on("-p", "--project PROJECT", "Name of project on GitHub.") do |last|
|
@@ -89,7 +89,7 @@ module GitHubChangelogGenerator
|
|
89
89
|
options[:add_sections] = v
|
90
90
|
end
|
91
91
|
opts.on("--front-matter [JSON]", "Add YAML front matter. Formatted as JSON because it's easier to add on the command line.") do |v|
|
92
|
-
options[:frontmatter] = JSON.parse(v).to_yaml
|
92
|
+
options[:frontmatter] = "#{JSON.parse(v).to_yaml}---\n"
|
93
93
|
end
|
94
94
|
opts.on("--pr-label [LABEL]", "Set up custom label for pull requests section. Default is \"**Merged pull requests:**\".") do |v|
|
95
95
|
options[:merge_prefix] = v
|
@@ -109,6 +109,9 @@ module GitHubChangelogGenerator
|
|
109
109
|
opts.on("--[no-]filter-by-milestone", "Use milestone to detect when issue was resolved. Default is true.") do |last|
|
110
110
|
options[:filter_issues_by_milestone] = last
|
111
111
|
end
|
112
|
+
opts.on("--[no-]issues-of-open-milestones", "Include issues of open milestones. Default is true.") do |v|
|
113
|
+
options[:issues_of_open_milestones] = v
|
114
|
+
end
|
112
115
|
opts.on("--[no-]author", "Add author of pull request at the end. Default is true.") do |author|
|
113
116
|
options[:author] = author
|
114
117
|
end
|
@@ -157,6 +160,9 @@ module GitHubChangelogGenerator
|
|
157
160
|
opts.on("--issue-line-labels x,y,z", Array, 'The specified labels will be shown in brackets next to each matching issue. Use "ALL" to show all labels. Default is [].') do |list|
|
158
161
|
options[:issue_line_labels] = list
|
159
162
|
end
|
163
|
+
opts.on("--include-tags-regex [REGEX]", "Apply a regular expression on tag names so that they can be included, for example: --include-tags-regex \".*\+\d{1,}\".") do |last|
|
164
|
+
options[:include_tags_regex] = last
|
165
|
+
end
|
160
166
|
opts.on("--exclude-tags x,y,z", Array, "Changelog will exclude specified tags") do |list|
|
161
167
|
options[:exclude_tags] = list
|
162
168
|
end
|
@@ -169,6 +175,9 @@ module GitHubChangelogGenerator
|
|
169
175
|
opts.on("--due-tag x", "Changelog will end before specified tag.") do |v|
|
170
176
|
options[:due_tag] = v
|
171
177
|
end
|
178
|
+
opts.on("--since-commit x", "Fetch only commits after this time. eg. \"2017-01-01 10:00:00\"") do |v|
|
179
|
+
options[:since_commit] = v
|
180
|
+
end
|
172
181
|
opts.on("--max-issues [NUMBER]", Integer, "Maximum number of issues to fetch from GitHub. Default is unlimited.") do |max|
|
173
182
|
options[:max_issues] = max
|
174
183
|
end
|
@@ -230,6 +239,7 @@ module GitHubChangelogGenerator
|
|
230
239
|
add_pr_wo_labels: true,
|
231
240
|
pulls: true,
|
232
241
|
filter_issues_by_milestone: true,
|
242
|
+
issues_of_open_milestones: true,
|
233
243
|
author: true,
|
234
244
|
unreleased: true,
|
235
245
|
unreleased_label: "Unreleased",
|
@@ -56,7 +56,7 @@ module GitHubChangelogGenerator
|
|
56
56
|
|
57
57
|
# Returns true if the line starts with a pound sign or a semi-colon.
|
58
58
|
def non_configuration_line?(line)
|
59
|
-
line =~ /^[\#;]/ || line =~
|
59
|
+
line =~ /^[\#;]/ || line =~ /^\s+$/
|
60
60
|
end
|
61
61
|
|
62
62
|
# Returns a the option name as a symbol and its string value sans newlines.
|
@@ -29,8 +29,8 @@ module GitHubChangelogGenerator
|
|
29
29
|
defaults = {
|
30
30
|
heading_level: "##",
|
31
31
|
heading_structures: [
|
32
|
-
/^## \[(?<version>.+?)\]\((?<url>.+?)\)( \((?<date>.+?)\))?$/,
|
33
|
-
/^## (?<version>.+?)( \((?<date>.+?)\))?$/
|
32
|
+
/^## \[(?<version>.+?)\]\((?<url>.+?)\)( \((?<date>.+?)\))?$/, # rubocop:disable Lint/MixedRegexpCaptureTypes
|
33
|
+
/^## (?<version>.+?)( \((?<date>.+?)\))?$/ # rubocop:disable Lint/MixedRegexpCaptureTypes
|
34
34
|
]
|
35
35
|
}
|
36
36
|
|
@@ -15,11 +15,11 @@ module GitHubChangelogGenerator
|
|
15
15
|
pulls filter_issues_by_milestone author
|
16
16
|
unreleased_only unreleased unreleased_label
|
17
17
|
compare_link include_labels exclude_labels
|
18
|
-
bug_labels enhancement_labels
|
18
|
+
bug_labels enhancement_labels include_tags_regex
|
19
19
|
between_tags exclude_tags exclude_tags_regex since_tag max_issues
|
20
20
|
github_site github_endpoint simple_list
|
21
21
|
future_release release_branch verbose release_url
|
22
|
-
base configure_sections add_sections]
|
22
|
+
base configure_sections add_sections http_cache]
|
23
23
|
|
24
24
|
OPTIONS.each do |o|
|
25
25
|
attr_accessor o.to_sym
|
@@ -31,6 +31,7 @@ module GitHubChangelogGenerator
|
|
31
31
|
#
|
32
32
|
# GitHubChangelogGenerator::RakeTask.new
|
33
33
|
def initialize(*args, &task_block)
|
34
|
+
super
|
34
35
|
@name = args.shift || :changelog
|
35
36
|
|
36
37
|
define(args, &task_block)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
.\" generated with Ronn/v0.7.3
|
2
2
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
3
|
.
|
4
|
-
.TH "GIT\-GENERATE\-CHANGELOG" "1" "May
|
4
|
+
.TH "GIT\-GENERATE\-CHANGELOG" "1" "May 2020" "" ""
|
5
5
|
.
|
6
6
|
.SH "NAME"
|
7
7
|
\fBgit\-generate\-changelog\fR \- Generate changelog from GitHub
|
@@ -157,6 +157,12 @@ Include pull\-requests in changelog\. Default is true\.
|
|
157
157
|
Use milestone to detect when issue was resolved\. Default is true\.
|
158
158
|
.
|
159
159
|
.P
|
160
|
+
\-\-[no\-]issues\-of\-open\-milestones
|
161
|
+
.
|
162
|
+
.P
|
163
|
+
Include issues of open milestones\. Default is true\.
|
164
|
+
.
|
165
|
+
.P
|
160
166
|
\-\-[no\-]author
|
161
167
|
.
|
162
168
|
.P
|
@@ -277,6 +283,12 @@ Changelog will start after specified tag\.
|
|
277
283
|
Changelog will end before specified tag\.
|
278
284
|
.
|
279
285
|
.P
|
286
|
+
\-\-since\-commit x
|
287
|
+
.
|
288
|
+
.P
|
289
|
+
Fetch only commits after this time\. eg\. "2017\-01\-01 10:00:00"
|
290
|
+
.
|
291
|
+
.P
|
280
292
|
\-\-max\-issues [NUMBER]
|
281
293
|
.
|
282
294
|
.P
|
@@ -375,7 +387,7 @@ GitHub pull requests that have been merged whose merge commit SHA has been modif
|
|
375
387
|
Written by Petr Korolev sky4winder@gmail\.com
|
376
388
|
.
|
377
389
|
.SH "REPORTING BUGS"
|
378
|
-
<\fIhttps://github\.com/github
|
390
|
+
<\fIhttps://github\.com/github\-changelog\-generator/github\-changelog\-generator/issues\fR>
|
379
391
|
.
|
380
392
|
.SH "SEE ALSO"
|
381
|
-
<\fIhttps://github\.com/github
|
393
|
+
<\fIhttps://github\.com/github\-changelog\-generator/github\-changelog\-generator/\fR>
|
@@ -181,6 +181,10 @@
|
|
181
181
|
|
182
182
|
<p> Use milestone to detect when issue was resolved. Default is true.</p>
|
183
183
|
|
184
|
+
<p> --[no-]issues-of-open-milestones</p>
|
185
|
+
|
186
|
+
<p> Include issues of open milestones. Default is true.</p>
|
187
|
+
|
184
188
|
<p> --[no-]author</p>
|
185
189
|
|
186
190
|
<p> Add author of pull request at the end. Default is true.</p>
|
@@ -261,6 +265,10 @@
|
|
261
265
|
|
262
266
|
<p> Changelog will end before specified tag.</p>
|
263
267
|
|
268
|
+
<p> --since-commit x</p>
|
269
|
+
|
270
|
+
<p> Fetch only commits after this time. eg. "2017-01-01 10:00:00"</p>
|
271
|
+
|
264
272
|
<p> --max-issues [NUMBER]</p>
|
265
273
|
|
266
274
|
<p> Maximum number of issues to fetch from GitHub. Default is unlimited.</p>
|
@@ -342,7 +350,7 @@
|
|
342
350
|
|
343
351
|
<ol class='man-decor man-foot man foot'>
|
344
352
|
<li class='tl'></li>
|
345
|
-
<li class='tc'>May
|
353
|
+
<li class='tc'>May 2020</li>
|
346
354
|
<li class='tr'>git-generate-changelog(1)</li>
|
347
355
|
</ol>
|
348
356
|
|
@@ -107,6 +107,10 @@ Automatically generate changelog from your tags, issues, labels and pull request
|
|
107
107
|
|
108
108
|
Use milestone to detect when issue was resolved. Default is true.
|
109
109
|
|
110
|
+
--[no-]issues-of-open-milestones
|
111
|
+
|
112
|
+
Include issues of open milestones. Default is true.
|
113
|
+
|
110
114
|
--[no-]author
|
111
115
|
|
112
116
|
Add author of pull request at the end. Default is true.
|
@@ -187,6 +191,10 @@ Automatically generate changelog from your tags, issues, labels and pull request
|
|
187
191
|
|
188
192
|
Changelog will end before specified tag.
|
189
193
|
|
194
|
+
--since-commit x
|
195
|
+
|
196
|
+
Fetch only commits after this time. eg. "2017-01-01 10:00:00"
|
197
|
+
|
190
198
|
--max-issues [NUMBER]
|
191
199
|
|
192
200
|
Maximum number of issues to fetch from GitHub. Default is unlimited.
|
data/spec/spec_helper.rb
CHANGED
@@ -44,7 +44,7 @@ VCR.configure do |c|
|
|
44
44
|
decode_compressed_response: true
|
45
45
|
}
|
46
46
|
c.filter_sensitive_data("<GITHUB_TOKEN>") do
|
47
|
-
"token #{ENV.fetch('CHANGELOG_GITHUB_TOKEN'
|
47
|
+
"token #{ENV.fetch('CHANGELOG_GITHUB_TOKEN', 'frobnitz')}"
|
48
48
|
end
|
49
49
|
|
50
50
|
c.configure_rspec_metadata!
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rubocop:disable Metrics/ModuleLength
|
4
3
|
module GitHubChangelogGenerator
|
5
4
|
RSpec.describe Entry do
|
6
5
|
def label(name)
|
@@ -58,9 +57,6 @@ module GitHubChangelogGenerator
|
|
58
57
|
let(:issues) { [] }
|
59
58
|
let(:pull_requests) { [] }
|
60
59
|
let(:tags) { [] }
|
61
|
-
let(:compare_shas) do
|
62
|
-
{ "aaaaa1...master" => ["aaaaa1"] }
|
63
|
-
end
|
64
60
|
|
65
61
|
# Default to standard options minus verbose to avoid output during testing.
|
66
62
|
let(:options) do
|
@@ -76,15 +72,14 @@ module GitHubChangelogGenerator
|
|
76
72
|
fetch_closed_issues_and_pr: [issues, pull_requests],
|
77
73
|
fetch_closed_pull_requests: [],
|
78
74
|
fetch_events_async: issues + pull_requests,
|
79
|
-
|
75
|
+
fetch_tag_shas: nil,
|
80
76
|
fetch_comments_async: nil,
|
81
77
|
default_branch: "master",
|
82
78
|
oldest_commit: { "sha" => "aaaaa1" },
|
83
79
|
fetch_commit: { "commit" => { "author" => { "date" => Time.now.utc } } }
|
84
80
|
)
|
85
|
-
allow(fake_fetcher).to receive(:
|
86
|
-
|
87
|
-
{ "commits" => compare_shas["#{old}...#{new}"].collect { |sha| { "sha" => sha } } }
|
81
|
+
allow(fake_fetcher).to receive(:commits_in_branch) do
|
82
|
+
["aaaaa1"]
|
88
83
|
end
|
89
84
|
allow(GitHubChangelogGenerator::OctoFetcher).to receive(:new).and_return(fake_fetcher)
|
90
85
|
generator = GitHubChangelogGenerator::Generator.new(options)
|
@@ -426,6 +421,18 @@ module GitHubChangelogGenerator
|
|
426
421
|
sections_json.shift
|
427
422
|
end
|
428
423
|
end
|
424
|
+
context "parse also body_only" do
|
425
|
+
let(:sections_string) { "{ \"foo\": { \"prefix\": \"foofix\", \"labels\": [\"test1\", \"test2\"]}, \"bar\": { \"prefix\": \"barfix\", \"labels\": [\"test3\", \"test4\"], \"body_only\": true}}" }
|
426
|
+
|
427
|
+
it "returns correctly constructed sections" do
|
428
|
+
require "json"
|
429
|
+
|
430
|
+
parsed_sections = subject.send(:parse_sections, sections_string)
|
431
|
+
|
432
|
+
expect(parsed_sections[0].body_only).to eq false
|
433
|
+
expect(parsed_sections[1].body_only).to eq true
|
434
|
+
end
|
435
|
+
end
|
429
436
|
end
|
430
437
|
context "hash" do
|
431
438
|
let(:sections_hash) do
|
@@ -548,14 +555,14 @@ module GitHubChangelogGenerator
|
|
548
555
|
end
|
549
556
|
|
550
557
|
it "assigns issues to the correct sections" do
|
551
|
-
breaking_section = entry_sections.
|
552
|
-
enhancement_section = entry_sections.
|
553
|
-
bug_section = entry_sections.
|
554
|
-
deprecated_section = entry_sections.
|
555
|
-
removed_section = entry_sections.
|
556
|
-
security_section = entry_sections.
|
557
|
-
issue_section = entry_sections.
|
558
|
-
merged_section = entry_sections.
|
558
|
+
breaking_section = entry_sections.find { |section| section.name == "breaking" }
|
559
|
+
enhancement_section = entry_sections.find { |section| section.name == "enhancements" }
|
560
|
+
bug_section = entry_sections.find { |section| section.name == "bugs" }
|
561
|
+
deprecated_section = entry_sections.find { |section| section.name == "deprecated" }
|
562
|
+
removed_section = entry_sections.find { |section| section.name == "removed" }
|
563
|
+
security_section = entry_sections.find { |section| section.name == "security" }
|
564
|
+
issue_section = entry_sections.find { |section| section.name == "issues" }
|
565
|
+
merged_section = entry_sections.find { |section| section.name == "merged" }
|
559
566
|
|
560
567
|
expect(titles_for(breaking_section.issues)).to eq(["issue breaking", "issue all the labels", "pr breaking", "pr all the labels"])
|
561
568
|
expect(titles_for(enhancement_section.issues)).to eq(["issue enhancement", "pr enhancement"])
|
@@ -612,10 +619,10 @@ module GitHubChangelogGenerator
|
|
612
619
|
end
|
613
620
|
|
614
621
|
it "assigns issues to the correct sections" do
|
615
|
-
foo_section = entry_sections.
|
616
|
-
bar_section = entry_sections.
|
617
|
-
issue_section = entry_sections.
|
618
|
-
merged_section = entry_sections.
|
622
|
+
foo_section = entry_sections.find { |section| section.name == "foo" }
|
623
|
+
bar_section = entry_sections.find { |section| section.name == "bar" }
|
624
|
+
issue_section = entry_sections.find { |section| section.name == "issues" }
|
625
|
+
merged_section = entry_sections.find { |section| section.name == "merged" }
|
619
626
|
|
620
627
|
aggregate_failures "checks all sections" do
|
621
628
|
expect(titles_for(foo_section.issues)).to eq(["issue test1", "issue all the labels", "issue some included labels", "pr test1", "pr all the labels", "pr some included labels"])
|
@@ -670,10 +677,10 @@ module GitHubChangelogGenerator
|
|
670
677
|
end
|
671
678
|
|
672
679
|
it "assigns issues to the correct sections" do
|
673
|
-
foo_section = entry_sections.
|
674
|
-
bar_section = entry_sections.
|
675
|
-
issue_section = entry_sections.
|
676
|
-
merged_section = entry_sections.
|
680
|
+
foo_section = entry_sections.find { |section| section.name == "foo" }
|
681
|
+
bar_section = entry_sections.find { |section| section.name == "bar" }
|
682
|
+
issue_section = entry_sections.find { |section| section.name == "issues" }
|
683
|
+
merged_section = entry_sections.find { |section| section.name == "merged" }
|
677
684
|
|
678
685
|
aggregate_failures "checks all sections" do
|
679
686
|
expect(titles_for(foo_section.issues)).to eq(["issue test1", "issue all the labels", "pr test1", "pr all the labels"])
|
@@ -737,12 +744,12 @@ module GitHubChangelogGenerator
|
|
737
744
|
end
|
738
745
|
|
739
746
|
it "assigns issues to the correct sections" do
|
740
|
-
foo_section = entry_sections.
|
741
|
-
breaking_section = entry_sections.
|
742
|
-
enhancement_section = entry_sections.
|
743
|
-
bug_section = entry_sections.
|
744
|
-
issue_section = entry_sections.
|
745
|
-
merged_section = entry_sections.
|
747
|
+
foo_section = entry_sections.find { |section| section.name == "foo" }
|
748
|
+
breaking_section = entry_sections.find { |section| section.name == "breaking" }
|
749
|
+
enhancement_section = entry_sections.find { |section| section.name == "enhancements" }
|
750
|
+
bug_section = entry_sections.find { |section| section.name == "bugs" }
|
751
|
+
issue_section = entry_sections.find { |section| section.name == "issues" }
|
752
|
+
merged_section = entry_sections.find { |section| section.name == "merged" }
|
746
753
|
|
747
754
|
aggregate_failures "checks all sections" do
|
748
755
|
expect(titles_for(breaking_section.issues)).to eq(["issue all the labels", "pr all the labels"])
|
@@ -757,4 +764,3 @@ module GitHubChangelogGenerator
|
|
757
764
|
end
|
758
765
|
end
|
759
766
|
end
|
760
|
-
# rubocop:enable Metrics/ModuleLength
|
@@ -5,82 +5,137 @@ module GitHubChangelogGenerator
|
|
5
5
|
let(:default_options) { GitHubChangelogGenerator::Parser.default_options.merge(verbose: false) }
|
6
6
|
let(:options) { {} }
|
7
7
|
let(:generator) { described_class.new(default_options.merge(options)) }
|
8
|
-
|
9
8
|
let(:bad_label) { { "name" => "BAD" } }
|
10
|
-
let(:bad_issue) { { "labels" => [bad_label] } }
|
11
9
|
let(:good_label) { { "name" => "GOOD" } }
|
12
|
-
let(:good_issue) { { "labels" => [good_label] } }
|
13
|
-
let(:unlabeled_issue) { { "labels" => [] } }
|
14
|
-
let(:issues) { [bad_issue, good_issue, unlabeled_issue] }
|
15
10
|
|
16
|
-
describe "
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
describe "pull requests" do
|
12
|
+
let(:bad_pull_request) { { "pull_request" => {}, "labels" => [bad_label] } }
|
13
|
+
let(:good_pull_request) { { "pull_request" => {}, "labels" => [good_label] } }
|
14
|
+
let(:unlabeled_pull_request) { { "pull_request" => {}, "labels" => [] } }
|
15
|
+
let(:pull_requests) { [bad_pull_request, good_pull_request, unlabeled_pull_request] }
|
20
16
|
|
21
|
-
|
17
|
+
describe "#filter_wo_labels" do
|
18
|
+
subject do
|
19
|
+
generator.filter_wo_labels(pull_requests)
|
20
|
+
end
|
22
21
|
|
23
|
-
|
22
|
+
let(:expected_pull_requests) { pull_requests }
|
24
23
|
|
25
|
-
|
26
|
-
let(:options) { { exclude_labels: %w[BAD BOO] } }
|
27
|
-
let(:expected_issues) { [good_issue, unlabeled_issue] }
|
24
|
+
it { is_expected.to eq(expected_pull_requests) }
|
28
25
|
|
29
|
-
|
30
|
-
|
26
|
+
context "when 'add_pr_wo_labels' is false" do
|
27
|
+
let(:options) { { add_pr_wo_labels: false } }
|
28
|
+
let(:expected_pull_requests) { [bad_pull_request, good_pull_request] }
|
31
29
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
it { is_expected.to eq(expected_pull_requests) }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when 'add_pr_wo_labels' is true" do
|
34
|
+
let(:options) { { add_pr_wo_labels: true } }
|
36
35
|
|
37
|
-
|
36
|
+
it { is_expected.to eq(expected_pull_requests) }
|
38
37
|
end
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
42
|
-
describe "
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
describe "issues" do
|
42
|
+
let(:bad_issue) { { "labels" => [bad_label] } }
|
43
|
+
let(:good_issue) { { "labels" => [good_label] } }
|
44
|
+
let(:unlabeled_issue) { { "labels" => [] } }
|
45
|
+
let(:issues) { [bad_issue, good_issue, unlabeled_issue] }
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
describe "#filter_wo_labels" do
|
48
|
+
subject do
|
49
|
+
generator.filter_wo_labels(issues)
|
50
|
+
end
|
50
51
|
|
51
|
-
|
52
|
-
let(:options) { { exclude_labels: %w[BAD BOO] } }
|
53
|
-
let(:expected_issues) { [good_issue, unlabeled_issue] }
|
52
|
+
let(:expected_issues) { issues }
|
54
53
|
|
55
54
|
it { is_expected.to eq(expected_issues) }
|
55
|
+
|
56
|
+
context "when 'add_issues_wo_labels' is false" do
|
57
|
+
let(:options) { { add_issues_wo_labels: false } }
|
58
|
+
let(:expected_issues) { [bad_issue, good_issue] }
|
59
|
+
|
60
|
+
it { is_expected.to eq(expected_issues) }
|
61
|
+
end
|
62
|
+
|
63
|
+
context "when 'add_issues_wo_labels' is true" do
|
64
|
+
let(:options) { { add_issues_wo_labels: true } }
|
65
|
+
|
66
|
+
it { is_expected.to eq(expected_issues) }
|
67
|
+
end
|
56
68
|
end
|
57
69
|
|
58
|
-
|
59
|
-
|
60
|
-
|
70
|
+
describe "#exclude_issues_by_labels" do
|
71
|
+
subject do
|
72
|
+
generator.exclude_issues_by_labels(issues)
|
73
|
+
end
|
74
|
+
|
75
|
+
let(:expected_issues) { issues }
|
61
76
|
|
62
77
|
it { is_expected.to eq(expected_issues) }
|
63
78
|
|
64
|
-
context "
|
65
|
-
let(:options) { {
|
66
|
-
let(:expected_issues) { [
|
79
|
+
context "when 'exclude_labels' is provided" do
|
80
|
+
let(:options) { { exclude_labels: %w[BAD BOO] } }
|
81
|
+
let(:expected_issues) { [good_issue, unlabeled_issue] }
|
67
82
|
|
68
83
|
it { is_expected.to eq(expected_issues) }
|
69
84
|
end
|
70
85
|
|
71
|
-
context "with
|
72
|
-
|
73
|
-
|
86
|
+
context "with no option given" do
|
87
|
+
subject(:generator) { described_class.new }
|
88
|
+
it "passes everything through when no option given" do
|
89
|
+
result = generator.exclude_issues_by_labels(issues)
|
74
90
|
|
75
|
-
|
91
|
+
expect(result).to eq(issues)
|
92
|
+
end
|
76
93
|
end
|
77
94
|
end
|
78
95
|
|
79
|
-
|
80
|
-
|
81
|
-
|
96
|
+
describe "#get_filtered_issues" do
|
97
|
+
subject do
|
98
|
+
generator.get_filtered_issues(issues)
|
99
|
+
end
|
100
|
+
|
101
|
+
let(:expected_issues) { issues }
|
82
102
|
|
83
103
|
it { is_expected.to eq(expected_issues) }
|
104
|
+
|
105
|
+
context "when 'exclude_labels' is provided" do
|
106
|
+
let(:options) { { exclude_labels: %w[BAD BOO] } }
|
107
|
+
let(:expected_issues) { [good_issue, unlabeled_issue] }
|
108
|
+
|
109
|
+
it { is_expected.to eq(expected_issues) }
|
110
|
+
end
|
111
|
+
|
112
|
+
context "when 'add_issues_wo_labels' is false" do
|
113
|
+
let(:options) { { add_issues_wo_labels: false } }
|
114
|
+
let(:expected_issues) { [bad_issue, good_issue] }
|
115
|
+
|
116
|
+
it { is_expected.to eq(expected_issues) }
|
117
|
+
|
118
|
+
context "with 'exclude_labels'" do
|
119
|
+
let(:options) { { add_issues_wo_labels: false, exclude_labels: %w[GOOD] } }
|
120
|
+
let(:expected_issues) { [bad_issue] }
|
121
|
+
|
122
|
+
it { is_expected.to eq(expected_issues) }
|
123
|
+
end
|
124
|
+
|
125
|
+
context "with 'include_labels'" do
|
126
|
+
let(:options) { { add_issues_wo_labels: false, include_labels: %w[GOOD] } }
|
127
|
+
let(:expected_issues) { [good_issue] }
|
128
|
+
|
129
|
+
it { is_expected.to eq(expected_issues) }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context "when 'include_labels' is specified" do
|
134
|
+
let(:options) { { include_labels: %w[GOOD] } }
|
135
|
+
let(:expected_issues) { [good_issue, unlabeled_issue] }
|
136
|
+
|
137
|
+
it { is_expected.to eq(expected_issues) }
|
138
|
+
end
|
84
139
|
end
|
85
140
|
end
|
86
141
|
end
|