github_changelog_generator 0.1.0 → 1.0.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/lib/github_changelog_generator.rb +114 -37
- data/lib/github_changelog_generator/parser.rb +12 -3
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 708023de08c4a6c9a5a1852acf35440cd35078dd
|
4
|
+
data.tar.gz: 5668160299fea03daa27c4796b6fbdbab6c2fdf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eeabccae5d7fdefb70e28c15db9acdd5844c83fe368ebe60cc19176378e65950678ace5009aa9045542689a5854169c2e27d07ee128c9d1609d845e626fc0885
|
7
|
+
data.tar.gz: 7f2628acfe95887086dcc8df2516626df59bb85788759da3e253e47406ad25cc71fe4c51d7c353ebad6b23008fb17a551c570e3ec27bd354199d04cc7b912d03
|
@@ -8,7 +8,7 @@ require_relative 'github_changelog_generator/parser'
|
|
8
8
|
|
9
9
|
class ChangelogGenerator
|
10
10
|
|
11
|
-
attr_accessor :options, :all_tags
|
11
|
+
attr_accessor :options, :all_tags, :github
|
12
12
|
|
13
13
|
def initialize()
|
14
14
|
|
@@ -20,6 +20,7 @@ class ChangelogGenerator
|
|
20
20
|
end
|
21
21
|
@all_tags = self.get_all_tags
|
22
22
|
@pull_requests = self.get_all_closed_pull_requests
|
23
|
+
@issues = self.get_all_issues
|
23
24
|
|
24
25
|
@tag_times_hash = {}
|
25
26
|
end
|
@@ -35,17 +36,14 @@ class ChangelogGenerator
|
|
35
36
|
|
36
37
|
|
37
38
|
def get_all_closed_pull_requests
|
38
|
-
|
39
|
-
|
40
|
-
issues = @github.pull_requests.list @options[:user], @options[:project], :state => 'closed'
|
41
|
-
json = issues.body
|
39
|
+
request = @github.pull_requests.list @options[:user], @options[:project], :state => 'closed'
|
40
|
+
pull_requests = request.body
|
42
41
|
|
43
42
|
if @options[:verbose]
|
44
43
|
puts 'Receive all pull requests'
|
45
44
|
end
|
46
45
|
|
47
|
-
|
48
|
-
|
46
|
+
pull_requests
|
49
47
|
end
|
50
48
|
|
51
49
|
def compund_changelog
|
@@ -87,7 +85,7 @@ class ChangelogGenerator
|
|
87
85
|
puts log
|
88
86
|
end
|
89
87
|
|
90
|
-
log += "\n\n
|
88
|
+
log += "\n\n**This file was generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
|
91
89
|
|
92
90
|
output_filename = "#{@options[:output]}"
|
93
91
|
File.open(output_filename, 'w') { |file| file.write(log) }
|
@@ -111,19 +109,6 @@ class ChangelogGenerator
|
|
111
109
|
@github.pull_requests.merged? @options[:user], @options[:project], number
|
112
110
|
end
|
113
111
|
|
114
|
-
def get_all_merged_pull_requests
|
115
|
-
json = self.get_all_closed_pull_requests
|
116
|
-
puts 'Check if the requests is merged... (it can take a while)'
|
117
|
-
|
118
|
-
json.delete_if { |req|
|
119
|
-
merged = self.is_megred(req[:number])
|
120
|
-
if @options[:verbose]
|
121
|
-
puts "##{req[:number]} #{merged ? 'merged' : 'not merged'}"
|
122
|
-
end
|
123
|
-
!merged
|
124
|
-
}
|
125
|
-
end
|
126
|
-
|
127
112
|
def get_all_tags
|
128
113
|
|
129
114
|
url = "https://api.github.com/repos/#{@options[:user]}/#{@options[:project]}/tags"
|
@@ -133,7 +118,7 @@ class ChangelogGenerator
|
|
133
118
|
end
|
134
119
|
|
135
120
|
response = HTTParty.get(url,
|
136
|
-
:headers => {'Authorization' =>
|
121
|
+
:headers => {'Authorization' => "token #{@options[:token]}",
|
137
122
|
'User-Agent' => 'Changelog-Generator'})
|
138
123
|
|
139
124
|
json_parse = JSON.parse(response.body)
|
@@ -160,15 +145,37 @@ class ChangelogGenerator
|
|
160
145
|
pull_requests = Array.new(@pull_requests)
|
161
146
|
|
162
147
|
pull_requests.delete_if { |req|
|
163
|
-
|
164
|
-
|
165
|
-
|
148
|
+
if req[:merged_at]
|
149
|
+
t = Time.parse(req[:merged_at]).utc
|
150
|
+
tag_is_later_since = t > since_tag_time
|
151
|
+
tag_is_before_till = t <= till_tag_time
|
152
|
+
|
153
|
+
in_range = (tag_is_later_since) && (tag_is_before_till)
|
154
|
+
!in_range
|
155
|
+
else
|
156
|
+
true
|
157
|
+
end
|
166
158
|
|
167
|
-
in_range = (tag_is_later_since) && (tag_is_before_till)
|
168
|
-
!in_range
|
169
159
|
}
|
170
160
|
|
171
|
-
|
161
|
+
issues = Array.new(@issues)
|
162
|
+
|
163
|
+
issues.delete_if{ |issue|
|
164
|
+
if issue[:closed_at]
|
165
|
+
t = Time.parse(issue[:closed_at]).utc
|
166
|
+
tag_is_later_since = t > since_tag_time
|
167
|
+
tag_is_before_till = t <= till_tag_time
|
168
|
+
|
169
|
+
in_range = (tag_is_later_since) && (tag_is_before_till)
|
170
|
+
!in_range
|
171
|
+
else
|
172
|
+
true
|
173
|
+
end
|
174
|
+
|
175
|
+
}
|
176
|
+
|
177
|
+
self.create_log(pull_requests, issues, till_tag_name, till_tag_time)
|
178
|
+
|
172
179
|
end
|
173
180
|
|
174
181
|
def generate_log_before_tag(tag)
|
@@ -178,26 +185,81 @@ class ChangelogGenerator
|
|
178
185
|
pull_requests = Array.new(@pull_requests)
|
179
186
|
|
180
187
|
pull_requests.delete_if { |req|
|
181
|
-
|
182
|
-
|
188
|
+
if req[:merged_at]
|
189
|
+
t = Time.parse(req[:merged_at]).utc
|
190
|
+
t > tag_time
|
191
|
+
else
|
192
|
+
true
|
193
|
+
end
|
194
|
+
|
195
|
+
}
|
196
|
+
|
197
|
+
issues = Array.new(@issues)
|
198
|
+
|
199
|
+
issues.delete_if{ |issue|
|
200
|
+
if issue[:closed_at]
|
201
|
+
t = Time.parse(issue[:closed_at]).utc
|
202
|
+
t > tag_time
|
203
|
+
else
|
204
|
+
true
|
205
|
+
end
|
183
206
|
}
|
184
207
|
|
185
|
-
self.create_log(pull_requests, tag_name, tag_time)
|
208
|
+
self.create_log(pull_requests, issues, tag_name, tag_time)
|
186
209
|
|
187
210
|
end
|
188
211
|
|
189
|
-
def create_log(pull_requests, tag_name, tag_time)
|
212
|
+
def create_log(pull_requests, issues, tag_name, tag_time)
|
190
213
|
|
214
|
+
# Generate tag name and link
|
191
215
|
trimmed_tag = tag_name.tr('v', '')
|
192
216
|
log = "## [#{trimmed_tag}] (https://github.com/#{@options[:user]}/#{@options[:project]}/tree/#{tag_name})\n"
|
193
217
|
|
218
|
+
#Generate date string:
|
194
219
|
time_string = tag_time.strftime @options[:format]
|
195
220
|
log += "#### #{time_string}\n"
|
196
221
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
222
|
+
if @options[:pulls]
|
223
|
+
# Generate pull requests:
|
224
|
+
if pull_requests
|
225
|
+
pull_requests.each { |dict|
|
226
|
+
merge = "#{dict[:title]} [\\##{dict[:number]}](https://github.com/#{@options[:user]}/#{@options[:project]}/pull/#{dict[:number]})\n\n"
|
227
|
+
log += "- #{merge}"
|
228
|
+
}
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
if @options[:issues]
|
233
|
+
# Generate issues:
|
234
|
+
if issues
|
235
|
+
issues.each { |dict|
|
236
|
+
is_bug = false
|
237
|
+
is_enhancement = false
|
238
|
+
dict.labels.each { |label|
|
239
|
+
if label.name == 'bug'
|
240
|
+
is_bug = true
|
241
|
+
end
|
242
|
+
if label.name == 'enhancement'
|
243
|
+
is_enhancement = true
|
244
|
+
end
|
245
|
+
}
|
246
|
+
|
247
|
+
intro = 'Closed issue'
|
248
|
+
if is_bug
|
249
|
+
intro = 'Fixed bug'
|
250
|
+
end
|
251
|
+
|
252
|
+
if is_enhancement
|
253
|
+
intro = 'Implemented enhancement'
|
254
|
+
end
|
255
|
+
|
256
|
+
merge = "*#{intro}:* #{dict[:title]} [\\##{dict[:number]}](https://github.com/#{@options[:user]}/#{@options[:project]}/issues/#{dict[:number]})\n\n"
|
257
|
+
log += "- #{merge}"
|
258
|
+
}
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
262
|
+
|
201
263
|
log
|
202
264
|
end
|
203
265
|
|
@@ -217,8 +279,23 @@ class ChangelogGenerator
|
|
217
279
|
@tag_times_hash[prev_tag['name']] = Time.parse(time_string)
|
218
280
|
end
|
219
281
|
|
282
|
+
def get_all_issues
|
283
|
+
all_issues = []
|
284
|
+
@options[:labels].each { |label|
|
285
|
+
issues = @github.issues.list user: @options[:user], repo: @options[:project], state: 'closed', filter: 'all', labels: label
|
286
|
+
all_issues = all_issues.concat(issues.body)
|
287
|
+
}
|
288
|
+
if @options[:verbose]
|
289
|
+
puts "Receive all closed issues with labels #{@options[:labels]}: #{all_issues.count} issues"
|
290
|
+
end
|
291
|
+
|
292
|
+
all_issues
|
293
|
+
|
294
|
+
end
|
295
|
+
|
220
296
|
end
|
221
297
|
|
222
298
|
if __FILE__ == $0
|
223
|
-
ChangelogGenerator.new
|
299
|
+
changelog_generator = ChangelogGenerator.new
|
300
|
+
changelog_generator.compund_changelog
|
224
301
|
end
|
@@ -3,7 +3,7 @@ require 'optparse'
|
|
3
3
|
|
4
4
|
class Parser
|
5
5
|
def self.parse_options
|
6
|
-
options = {:tag1 => nil, :tag2 => nil, :format => '%d/%m/%y', :output => 'CHANGELOG.md'}
|
6
|
+
options = {:tag1 => nil, :tag2 => nil, :format => '%d/%m/%y', :output => 'CHANGELOG.md', :labels => %w(bug enhancement), :pulls => true, :issues => true }
|
7
7
|
|
8
8
|
parser = OptionParser.new { |opts|
|
9
9
|
opts.banner = 'Usage: changelog_generator --user username --project project_name [options]'
|
@@ -23,15 +23,24 @@ class Parser
|
|
23
23
|
opts.on('-v', '--[no-]verbose', 'Run verbosely') do |v|
|
24
24
|
options[:verbose] = v
|
25
25
|
end
|
26
|
-
opts.on('
|
26
|
+
opts.on('--[no-]issues', 'Include closed issues to changelog. Default is true') do |v|
|
27
|
+
options[:issues] = v
|
28
|
+
end
|
29
|
+
opts.on('--[no-]pull-requests', 'Include pull-requests to changelog. Default is true') do |v|
|
30
|
+
options[:pulls] = v
|
31
|
+
end
|
32
|
+
opts.on('-l', '--last-changes', 'Generate log between last 2 tags only') do |last|
|
27
33
|
options[:last] = last
|
28
34
|
end
|
29
35
|
opts.on('-f', '--date-format [FORMAT]', 'Date format. Default is %d/%m/%y') do |last|
|
30
36
|
options[:format] = last
|
31
37
|
end
|
32
|
-
opts.on('-o', '--output [
|
38
|
+
opts.on('-o', '--output [NAME]', 'Output file. Default is CHANGELOG.md') do |last|
|
33
39
|
options[:output] = last
|
34
40
|
end
|
41
|
+
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|
|
42
|
+
options[:labels] = list
|
43
|
+
end
|
35
44
|
}
|
36
45
|
|
37
46
|
parser.parse!
|