github_changelog_generator 1.1.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc28a7bacd92b9bd2e5abdef760d348fc711540c
4
- data.tar.gz: fb8856f86cd8e9988481f407b667f22209307563
3
+ metadata.gz: 04d90423721767edc0514ae6301fb296e3dacca8
4
+ data.tar.gz: 2ab86b4d1d8fc0ab004eafc26ffede1a6bd0e08a
5
5
  SHA512:
6
- metadata.gz: 0e0d0694c082fc9f51f47f30baa3d1f1572ecbf20d773564c1e8fd22fb9f31f421fd60c76f695502082c258193716689e904cc762cb5f1eefea214a62233073e
7
- data.tar.gz: d1a2a0aef52861f68563d3fec4fca64e46b5f794a09669cfdc49fbfc0336f763e61ad1d0676291a9f218834bf4bbcf27e237902129adb2947c209447743a1606
6
+ metadata.gz: bcc94ae00a530a5202704fc94ed76b8118234d1b1a45b6a78f928470bdb49e3f6cd9d38dc6af6e2a4cc5d63cc92df4041fcf769c6febc8f306d23036d1b50381
7
+ data.tar.gz: e5a2346e221265eb2e620d2a3224f3a6a584c80d49392711b8ee3aebafdec166bdeda33d5ae19efdefd0d9ec19fafbb226784788cad82f67f4da53a2b5b5c38e
@@ -1,10 +1,10 @@
1
1
  # Changelog
2
2
 
3
- ## [1.1.3] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.3)
3
+ ## [1.1.4] (https://github.com/skywinder/Github-Changelog-Generator/tree/1.1.4)
4
4
  #### 18/11/14
5
5
  - *Merged pull-request:* Sort tags by date [\#23](https://github.com/skywinder/Github-Changelog-Generator/pull/23)
6
6
 
7
- - *Implemented enhancement:* Implement ability to retrieve GitHub token from some shell variable (to not put it to script directly) [\#19](https://github.com/skywinder/Github-Changelog-Generator/issues/19)
7
+ - *Implemented enhancement:* Implement ability to retrieve GitHub token from ENV variable (to not put it to script directly) [\#19](https://github.com/skywinder/Github-Changelog-Generator/issues/19)
8
8
 
9
9
  - *Fixed bug:* Script fills changelog only for first 30 tags. [\#20](https://github.com/skywinder/Github-Changelog-Generator/issues/20)
10
10
 
data/README.md CHANGED
@@ -27,18 +27,20 @@ As output you will get `CHANGELOG.md` file with *pretty Markdown-formatted* chan
27
27
  Type `github_changelog_generator --help` for detailed usage.
28
28
 
29
29
  Usage: changelog_generator [options]
30
- -u, --user [USER] Username of the owner of target GitHub repo
31
- -p, --project [PROJECT] Name of project on GitHub
32
- -t, --token [TOKEN] To make more than 50 requests this script required your OAuth token for GitHub. You can generate it on https://github.com/settings/applications
33
- -h, --help Displays Help
34
- -v, --[no-]verbose Run verbosely. Default is true
35
- --[no-]issues Include closed issues to changelog. Default is true
36
- --[no-]issues-without-labels Include closed issues without any labels to changelog. Default is true
37
- --[no-]pull-requests Include pull-requests to changelog. Default is true
38
- -l, --last-changes Generate log between last 2 tags only
39
- -f, --date-format [FORMAT] Date format. Default is %d/%m/%y
40
- -o, --output [NAME] Output file. Default is CHANGELOG.md
41
- --labels x,y,z List of labels. Issues with that labels will be included to changelog. Default is 'bug,enhancement'
30
+ -u, --user [USER] Username of the owner of target GitHub repo
31
+ -p, --project [PROJECT] Name of project on GitHub
32
+ -t, --token [TOKEN] To make more than 50 requests this script required your OAuth token for GitHub. You can generate here: https://github.com/settings/tokens/new
33
+ -h, --help Displays Help
34
+ --[no-]verbose Run verbosely. Default is true
35
+ --[no-]issues Include closed issues to changelog. Default is true
36
+ --[no-]issues-without-labels Include closed issues without any labels to changelog. Default is true
37
+ --[no-]pull-requests Include pull-requests to changelog. Default is true
38
+ -l, --last-changes Generate log between last 2 tags only
39
+ --[no-]author Add author of pull-request in the end. Default is true
40
+ -f, --date-format [FORMAT] Date format. Default is %d/%m/%y
41
+ -o, --output [NAME] Output file. Default is CHANGELOG.md
42
+ --labels x,y,z List of labels. Issues with that labels will be included to changelog. Default is 'bug,enhancement'
43
+ -v, --version Print version number
42
44
 
43
45
  ## Examples:
44
46
 
@@ -25,7 +25,11 @@ module GitHubChangelogGenerator
25
25
 
26
26
  @all_tags = self.get_all_tags
27
27
  @pull_requests = self.get_all_closed_pull_requests
28
- @issues = self.get_all_issues
28
+ if @options[:issues]
29
+ @issues = self.get_all_issues
30
+ else
31
+ @issues = []
32
+ end
29
33
 
30
34
  @tag_times_hash = {}
31
35
  end
@@ -41,6 +45,11 @@ module GitHubChangelogGenerator
41
45
 
42
46
 
43
47
  def get_all_closed_pull_requests
48
+
49
+ if @options[:verbose]
50
+ puts 'Fetching pull requests..'
51
+ end
52
+
44
53
  response = @github.pull_requests.list @options[:user], @options[:project], :state => 'closed'
45
54
 
46
55
  pull_requests = []
@@ -49,9 +58,39 @@ module GitHubChangelogGenerator
49
58
  end
50
59
 
51
60
  if @options[:verbose]
52
- puts "Receive all pull requests: #{pull_requests.count}"
61
+ puts "Received all closed pull requests: #{pull_requests.count}"
53
62
  end
54
63
 
64
+ unless @options[:pull_request_labels].nil?
65
+
66
+ if @options[:verbose]
67
+ puts 'Filter all pull requests by labels.'
68
+ end
69
+
70
+ filtered_pull_requests = pull_requests.select { |pull_request|
71
+ #We need issue to fetch labels
72
+ issue = @github.issues.get @options[:user], @options[:project], pull_request.number
73
+ #compare is there any labels from @options[:labels] array
74
+ select_no_label = !issue.labels.map { |label| label.name }.any?
75
+
76
+ if @options[:verbose]
77
+ puts "Filter request \##{issue.number}."
78
+ end
79
+
80
+ if @options[:pull_request_labels].any?
81
+ select_by_label = (issue.labels.map { |label| label.name } & @options[:pull_request_labels]).any?
82
+ else
83
+ select_by_label = false
84
+ end
85
+
86
+ select_by_label | select_no_label
87
+ }
88
+
89
+ if @options[:verbose]
90
+ puts "Filtered pull requests with specified labels and w/o labels: #{filtered_pull_requests.count}"
91
+ end
92
+ return filtered_pull_requests
93
+ end
55
94
  pull_requests
56
95
  end
57
96
 
@@ -128,11 +167,8 @@ module GitHubChangelogGenerator
128
167
 
129
168
  def get_all_tags
130
169
 
131
- url = "https://api.github.com/repos/#{@options[:user]}/#{@options[:project]}/tags"
132
-
133
170
  if @options[:verbose]
134
-
135
- puts "Receive tags for repo #{url}"
171
+ puts 'Fetching all tags..'
136
172
  end
137
173
 
138
174
  response = @github.repos.tags @options[:user], @options[:project]
@@ -167,83 +203,47 @@ module GitHubChangelogGenerator
167
203
 
168
204
 
169
205
  def generate_log_between_tags(older_tag, newer_tag)
170
- older_tag_time = self.get_time_of_tag(older_tag)
171
- newer_tag_time = self.get_time_of_tag(newer_tag)
172
-
173
- # if we mix up tags order - lits fix it!
174
- # if older_tag_time < newer_tag_time
175
- # older_tag, newer_tag = newer_tag, older_tag
176
- # older_tag_time, newer_tag_time = newer_tag_time, older_tag_time
177
- # puts "Swap tags!"
178
- # end
179
206
 
207
+ newer_tag_time = self.get_time_of_tag(newer_tag)
180
208
  newer_tag_name = newer_tag['name']
181
209
 
182
- pull_requests = Array.new(@pull_requests)
210
+ if older_tag.nil?
211
+ filtered_pull_requests = delete_by_time(@pull_requests, :merged_at, newer_tag_time)
212
+ issues = delete_by_time(@issues, :closed_at, newer_tag_time)
213
+ else
214
+ older_tag_time = self.get_time_of_tag(older_tag)
215
+ filtered_pull_requests = delete_by_time(@pull_requests, :merged_at, newer_tag_time, older_tag_time)
216
+ issues = delete_by_time(@issues, :closed_at, newer_tag_time, older_tag_time)
217
+ end
183
218
 
184
- pull_requests.delete_if { |req|
185
- if req[:merged_at]
186
- t = Time.parse(req[:merged_at]).utc
187
- tag_is_older_of_older = t > older_tag_time
188
- tag_is_newer_than_new = t <= newer_tag_time
219
+ self.create_log(filtered_pull_requests, issues, newer_tag_name, newer_tag_time)
189
220
 
190
- tag_not_in_range = (tag_is_older_of_older) && (tag_is_newer_than_new)
191
- !tag_not_in_range
192
- else
193
- true
194
- end
221
+ end
195
222
 
196
- }
223
+ def delete_by_time(array, hash_key, newer_tag_time, older_tag_time = nil)
224
+ array_new = Array.new(array)
225
+ array_new.delete_if { |req|
226
+ if req[hash_key]
227
+ t = Time.parse(req[hash_key]).utc
197
228
 
198
- issues = Array.new(@issues)
229
+ if older_tag_time.nil?
230
+ tag_is_older_of_older = false
231
+ else
232
+ tag_is_older_of_older = t > older_tag_time
233
+ end
199
234
 
200
- issues.delete_if { |issue|
201
- if issue[:closed_at]
202
- t = Time.parse(issue[:closed_at]).utc
203
- tag_is_later_since = t > older_tag_time
204
- tag_is_before_till = t <= newer_tag_time
235
+ tag_is_newer_than_new = t <= newer_tag_time
205
236
 
206
- in_range = (tag_is_later_since) && (tag_is_before_till)
207
- !in_range
237
+ tag_not_in_range = (tag_is_older_of_older) && (tag_is_newer_than_new)
238
+ !tag_not_in_range
208
239
  else
209
240
  true
210
241
  end
211
-
212
242
  }
213
-
214
- self.create_log(pull_requests, issues, newer_tag_name, newer_tag_time)
215
-
216
243
  end
217
244
 
218
245
  def generate_log_before_tag(tag)
219
- tag_time = self.get_time_of_tag(tag)
220
- tag_name = tag['name']
221
-
222
- pull_requests = Array.new(@pull_requests)
223
-
224
- pull_requests.delete_if { |req|
225
- if req[:merged_at]
226
- t = Time.parse(req[:merged_at]).utc
227
- t > tag_time
228
- else
229
- true
230
- end
231
-
232
- }
233
-
234
- issues = Array.new(@issues)
235
-
236
- issues.delete_if { |issue|
237
- if issue[:closed_at]
238
- t = Time.parse(issue[:closed_at]).utc
239
- t > tag_time
240
- else
241
- true
242
- end
243
- }
244
-
245
- self.create_log(pull_requests, issues, tag_name, tag_time)
246
-
246
+ generate_log_between_tags(nil, tag)
247
247
  end
248
248
 
249
249
  def create_log(pull_requests, issues, tag_name, tag_time)
@@ -259,10 +259,18 @@ module GitHubChangelogGenerator
259
259
  if @options[:pulls]
260
260
  # Generate pull requests:
261
261
  if pull_requests
262
- pull_requests.each { |dict|
263
- merge = "#{@options[:merge_prefix]}#{dict[:title]} [\\##{dict[:number]}](#{dict.html_url})\n\n"
264
- log += "- #{merge}"
265
- }
262
+ if @options[:author]
263
+ pull_requests.each { |dict|
264
+ merge = "#{@options[:merge_prefix]}#{dict[:title]} [\\##{dict[:number]}](#{dict.html_url}) ([#{dict.user.login}](#{dict.user.html_url}))\n\n"
265
+ log += "- #{merge}"
266
+ }
267
+ else
268
+ pull_requests.each { |dict|
269
+ merge = "#{@options[:merge_prefix]}#{dict[:title]} [\\##{dict[:number]}](#{dict.html_url})\n\n"
270
+ log += "- #{merge}"
271
+ }
272
+ end
273
+
266
274
  end
267
275
  end
268
276
 
@@ -330,6 +338,11 @@ module GitHubChangelogGenerator
330
338
  end
331
339
 
332
340
  def get_all_issues
341
+
342
+ if @options[:verbose]
343
+ puts 'Fetching closed issues..'
344
+ end
345
+
333
346
  response = @github.issues.list user: @options[:user], repo: @options[:project], state: 'closed', filter: 'all', labels: nil
334
347
 
335
348
 
@@ -344,7 +357,7 @@ module GitHubChangelogGenerator
344
357
  }
345
358
 
346
359
  if @options[:verbose]
347
- puts "Receive all closed issues: #{issues.count}"
360
+ puts "Received closed issues: #{issues.count}"
348
361
  end
349
362
 
350
363
  filtered_issues = issues.select { |issue|
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'optparse'
3
+ require 'PP'
3
4
  require_relative 'version'
4
5
 
5
6
  module GitHubChangelogGenerator
6
7
  class Parser
7
8
  def self.parse_options
8
- options = {:tag1 => nil, :tag2 => nil, :format => '%d/%m/%y', :output => 'CHANGELOG.md', :labels => %w(bug enhancement), :pulls => true, :issues => true, :verbose => true, :add_issues_wo_labels => true, :merge_prefix => '*Merged pull-request:* '}
9
+ options = {:tag1 => nil, :tag2 => nil, :format => '%d/%m/%y', :output => 'CHANGELOG.md', :labels => %w(bug enhancement), :pulls => true, :issues => true, :verbose => true, :add_issues_wo_labels => true, :merge_prefix => '*Merged pull-request:* ', :author => true, :pull_request_labels => %w(bug enhancement)}
9
10
 
10
11
  parser = OptionParser.new { |opts|
11
12
  opts.banner = 'Usage: changelog_generator [options]'
@@ -37,15 +38,21 @@ module GitHubChangelogGenerator
37
38
  opts.on('-l', '--last-changes', 'Generate log between last 2 tags only') do |last|
38
39
  options[:last] = last
39
40
  end
41
+ opts.on('--[no-]author', 'Add author of pull-request in the end. Default is true') do |author|
42
+ options[:last] = author
43
+ end
40
44
  opts.on('-f', '--date-format [FORMAT]', 'Date format. Default is %d/%m/%y') do |last|
41
45
  options[:format] = last
42
46
  end
43
47
  opts.on('-o', '--output [NAME]', 'Output file. Default is CHANGELOG.md') do |last|
44
48
  options[:output] = last
45
49
  end
46
- opts.on('--labels x,y,z', Array, 'List of labels. Issues with that labels will be included to changelog. Default is \'bug,enhancement\'') do |list|
50
+ opts.on('--labels x,y,z', Array, 'Issues with that labels will be included to changelog. Default is \'bug,enhancement\'') do |list|
47
51
  options[:labels] = list
48
52
  end
53
+ opts.on('--filter-pull-requests x,y,z', Array, 'Pull requests with that labels will be included to changelog. pull requests w\o labels will be included anyway. Default is \'bug,enhancement\'') do |list|
54
+ options[:pull_request_labels] = list
55
+ end
49
56
  opts.on('-v', '--version', 'Print version number') do |v|
50
57
  puts "Version: #{GitHubChangelogGenerator::VERSION}"
51
58
  exit
@@ -54,6 +61,12 @@ module GitHubChangelogGenerator
54
61
 
55
62
  parser.parse!
56
63
 
64
+ if options[:verbose]
65
+ puts 'Input options:'
66
+ pp options
67
+ puts ''
68
+ end
69
+
57
70
  #udefined case with 1 parameter:
58
71
  if ARGV[0] && !ARGV[1]
59
72
  puts parser.banner
@@ -1,3 +1,3 @@
1
1
  module GitHubChangelogGenerator
2
- VERSION = '1.1.4'
2
+ VERSION = '1.2.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github_changelog_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Petr Korolev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-18 00:00:00.000000000 Z
11
+ date: 2014-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler