create_github_release 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +40 -20
  5. data/create_github_release.gemspec +2 -0
  6. data/exe/create-github-release +12 -8
  7. data/lib/create_github_release/assertion_base.rb +25 -11
  8. data/lib/create_github_release/assertions/bundle_is_up_to_date.rb +4 -3
  9. data/lib/create_github_release/assertions/{docker_is_running.rb → gh_authenticated.rb} +9 -8
  10. data/lib/create_github_release/assertions/gh_command_exists.rb +3 -2
  11. data/lib/create_github_release/assertions/git_command_exists.rb +3 -2
  12. data/lib/create_github_release/assertions/in_git_repo.rb +3 -2
  13. data/lib/create_github_release/assertions/in_repo_root_directory.rb +3 -2
  14. data/lib/create_github_release/assertions/last_release_tag_exists.rb +45 -0
  15. data/lib/create_github_release/assertions/local_and_remote_on_same_commit.rb +4 -3
  16. data/lib/create_github_release/assertions/local_release_branch_does_not_exist.rb +9 -6
  17. data/lib/create_github_release/assertions/local_release_tag_does_not_exist.rb +4 -4
  18. data/lib/create_github_release/assertions/no_staged_changes.rb +3 -2
  19. data/lib/create_github_release/assertions/no_uncommitted_changes.rb +3 -2
  20. data/lib/create_github_release/assertions/on_default_branch.rb +5 -4
  21. data/lib/create_github_release/assertions/remote_release_branch_does_not_exist.rb +6 -5
  22. data/lib/create_github_release/assertions/remote_release_tag_does_not_exist.rb +6 -5
  23. data/lib/create_github_release/assertions.rb +2 -2
  24. data/lib/create_github_release/backtick_debug.rb +69 -0
  25. data/lib/create_github_release/change.rb +73 -0
  26. data/lib/create_github_release/changelog.rb +54 -73
  27. data/lib/create_github_release/command_line_options.rb +367 -0
  28. data/lib/create_github_release/command_line_parser.rb +113 -25
  29. data/lib/create_github_release/project.rb +787 -0
  30. data/lib/create_github_release/release_assertions.rb +3 -3
  31. data/lib/create_github_release/release_tasks.rb +1 -1
  32. data/lib/create_github_release/task_base.rb +25 -11
  33. data/lib/create_github_release/tasks/commit_release.rb +4 -3
  34. data/lib/create_github_release/tasks/create_github_release.rb +16 -35
  35. data/lib/create_github_release/tasks/create_release_branch.rb +6 -5
  36. data/lib/create_github_release/tasks/create_release_pull_request.rb +10 -42
  37. data/lib/create_github_release/tasks/create_release_tag.rb +6 -5
  38. data/lib/create_github_release/tasks/push_release.rb +5 -4
  39. data/lib/create_github_release/tasks/update_changelog.rb +16 -67
  40. data/lib/create_github_release/tasks/update_version.rb +4 -3
  41. data/lib/create_github_release/version.rb +1 -1
  42. data/lib/create_github_release.rb +4 -2
  43. metadata +37 -7
  44. data/lib/create_github_release/assertions/changelog_docker_container_exists.rb +0 -73
  45. data/lib/create_github_release/options.rb +0 -397
  46. data/lib/create_github_release/release.rb +0 -82
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CreateGithubRelease
4
+ # Include this module to output debug information for backticks
5
+ #
6
+ # The class this module is included in must have a `backtick_debug?` method.
7
+ #
8
+ # @example Using this module to debug backticks
9
+ # class Foo
10
+ # include CreateGithubRelease::BacktickDebug
11
+ #
12
+ # def backtick_debug?; true; end
13
+ #
14
+ # def bar
15
+ # `echo foo`
16
+ # end
17
+ # end
18
+ #
19
+ # Foo.new.bar #=>
20
+ # COMMAND
21
+ # echo foo
22
+ # OUTPUT
23
+ # foo
24
+ # EXITSTATUS
25
+ # 0
26
+ #
27
+ # @api public
28
+ #
29
+ module BacktickDebug
30
+ # Calls `super` and shows the command and its result if `backtick_debug?` is true
31
+ #
32
+ # The command, it's output, and it's exit status are output to stdout via `puts`.
33
+ #
34
+ # The including class is expected to have a `backtick_debug?` method.
35
+ #
36
+ # @example
37
+ # including_class.new.send('`'.to_sym, 'echo foo') #=>
38
+ # COMMAND
39
+ # echo foo
40
+ # OUTPUT
41
+ # foo
42
+ # EXITSTATUS
43
+ # 0
44
+ #
45
+ # @example A command that fails
46
+ # including_class.new.send('`'.to_sym, 'echo foo; exit 1') #=>
47
+ # COMMAND
48
+ # echo foo
49
+ # OUTPUT
50
+ # foo
51
+ # EXITSTATUS
52
+ # 1
53
+ #
54
+ # @param command [String] the command to execute
55
+ #
56
+ # @return [String] the output of the command
57
+ #
58
+ def `(command)
59
+ puts "COMMAND\n #{command}" if backtick_debug?
60
+ super.tap do |output|
61
+ if backtick_debug?
62
+ puts "OUTPUT\n"
63
+ output.lines { |l| puts " #{l.chomp}" }
64
+ puts "EXITSTATUS\n #{$CHILD_STATUS.exitstatus}\n"
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CreateGithubRelease
4
+ # The release information needed to generate a changelog
5
+ #
6
+ # @api public
7
+ #
8
+ class Change
9
+ # Create a new release object
10
+ #
11
+ # @example
12
+ # sha = 'f5e69d6'
13
+ # subject = 'Release v1.0.0'
14
+ #
15
+ # change = CreateGithubRelease::Change.new(sha, subject)
16
+ # change.sha # => 'f5e69d6'
17
+ # change.subject # => 'Release v1.0.0'
18
+ #
19
+ # @param sha [String] The sha of the change
20
+ # @param subject [String] The subject (aka description) of the change
21
+ #
22
+ def initialize(sha, subject)
23
+ @sha = sha
24
+ @subject = subject
25
+ end
26
+
27
+ # The commit sha of the change
28
+ #
29
+ # @example
30
+ # sha = 'f5e69d6'
31
+ # subject = 'Release v1.0.0'
32
+ #
33
+ # change = CreateGithubRelease::Change.new(sha, subject))
34
+ # change.sha # => 'f5e69d6'
35
+ #
36
+ # @return [String] The commit sha of the change
37
+ attr_reader :sha
38
+
39
+ # The subject (aka description) of the change
40
+ #
41
+ # @example
42
+ # sha = 'f5e69d6'
43
+ # subject = 'Release v1.0.0'
44
+ #
45
+ # change = CreateGithubRelease::Change.new(sha, subject))
46
+ # change.subject # => 'Release v1.0.0'
47
+ #
48
+ # @return [String] The subject (aka description) of the change
49
+ attr_reader :subject
50
+
51
+ # Compare two changes to see if they refer to the same change
52
+ #
53
+ # Two changes are equal if their `sha` and `subject` attributes are equal.
54
+ #
55
+ # @example
56
+ # change1 = CreateGithubRelease::Change.new('f5e69d6', 'Release v1.0.0')
57
+ # change2 = CreateGithubRelease::Change.new('f5e69d6', 'Release v1.0.0')
58
+ # change3 = CreateGithubRelease::Change.new('9387be0', 'Release v1.0.0')
59
+ # change4 = CreateGithubRelease::Change.new('f5e69d6', 'Release v2.0.0')
60
+ # change5 = CreateGithubRelease::Change.new('9387be0', 'Release v2.0.0')
61
+ # change1 == change2 #=> true
62
+ # change1 == change3 #=> false
63
+ # change1 == change4 #=> false
64
+ # change1 == change5 #=> false
65
+ #
66
+ # @param other [CreateGithubRelease::Change] The other change to compare this change to
67
+ #
68
+ # @return [Boolean] true if the two changes are equal, false otherwise
69
+ def ==(other)
70
+ self.class == other.class && sha == other.sha && subject == other.subject
71
+ end
72
+ end
73
+ end
@@ -22,16 +22,13 @@ module CreateGithubRelease
22
22
  # * 07a1167 Release v0.1.0 (#1)
23
23
  # EXISTING_CHANGELOG
24
24
  #
25
- # new_release_tag = 'v1.0.0'
26
- # new_release_date = Date.parse('2022-11-10')
27
- # new_release_description = <<~RELEASE
28
- # * f5e69d6 Release v1.0.0 (#4)
29
- # * 8fe479b Update documentation for initial GA release (#3)
30
- # RELEASE
25
+ # next_release_description = <<~next_release_DESCRIPTION
26
+ # ## v1.0.0 (2022-11-10)
31
27
  #
32
- # new_release = CreateGithubRelease::Release.new(new_release_tag, new_release_date, new_release_description)
28
+ # * f5e69d6 Release v1.0.0 (#4)
29
+ # next_release_DESCRIPTION
33
30
  #
34
- # changelog = CreateGithubRelease::Changelog.new(existing_changelog, new_release)
31
+ # changelog = CreateGithubRelease::Changelog.new(existing_changelog, next_release_description)
35
32
  #
36
33
  # expected_new_changelog = <<~CHANGELOG
37
34
  # # Change Log
@@ -41,7 +38,6 @@ module CreateGithubRelease
41
38
  # ## v1.0.0 (2022-11-10)
42
39
  #
43
40
  # * f5e69d6 Release v1.0.0 (#4)
44
- # * 8fe479b Update documentation for initial GA release (#3)
45
41
  #
46
42
  # ## v0.1.0 (2022-10-31)
47
43
  #
@@ -50,15 +46,15 @@ module CreateGithubRelease
50
46
  #
51
47
  # changelog.front_matter # => "# Change Log\n\nList of changes in each release of this project."
52
48
  # changelog.body # => "## v0.1.0 (2022-10-31)\n\n* 07a1167 Release v0.1.0 (#1)"
53
- # changelog.new_release # => #<CreateGithubRelease::Release:0x000000010761aac8 ...>
49
+ # changelog.next_release_description # => "## v1.0.0 (2022-11-10)\n\n..."
54
50
  # changelog.to_s == expected_new_changelog # => true
55
51
  #
56
52
  # @param existing_changelog [String] Contents of the changelog as a string
57
- # @param new_release [CreateGihubRelease::Release] The new release to add to the changelog
53
+ # @param next_release_description [String] The description of the next release to add to the changelog
58
54
  #
59
- def initialize(existing_changelog, new_release)
55
+ def initialize(existing_changelog, next_release_description)
60
56
  @existing_changelog = existing_changelog
61
- @new_release = new_release
57
+ @next_release_description = next_release_description
62
58
 
63
59
  @lines = existing_changelog.lines.map(&:chomp)
64
60
  end
@@ -75,9 +71,9 @@ module CreateGithubRelease
75
71
  # ...
76
72
  # CHANGELOG
77
73
  #
78
- # new_release = CreateGithubRelease::Release.new('v0.1.0', Date.today, '...')
74
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
79
75
  #
80
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
76
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
81
77
  # changelog.front_matter # => "This is the front matter\n"
82
78
  #
83
79
  # @example Changelog without front matter
@@ -86,26 +82,26 @@ module CreateGithubRelease
86
82
  # ...
87
83
  # CHANGELOG
88
84
  #
89
- # new_release = CreateGithubRelease::Release.new('v0.1.0', Date.today, '...')
85
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
90
86
  #
91
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
87
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
92
88
  # changelog.front_matter # => ""
93
89
  #
94
90
  # @example An empty changelog
95
91
  # changelog_text = <<~CHANGELOG
96
92
  # CHANGELOG
97
93
  #
98
- # new_release = CreateGithubRelease::Release.new('v0.1.0', Date.today, '...')
94
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
99
95
  #
100
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
96
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
101
97
  # changelog.front_matter # => ""
102
98
  #
103
99
  # @example An empty changelog
104
100
  # changelog_text = ""
105
101
  #
106
- # new_release = CreateGithubRelease::Release.new('v0.1.0', Date.today, '...')
102
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
107
103
  #
108
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
104
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
109
105
  # changelog.front_matter # => ""
110
106
  #
111
107
  # @return [String] The front matter of the changelog
@@ -124,9 +120,9 @@ module CreateGithubRelease
124
120
  # ...
125
121
  # CHANGELOG
126
122
  #
127
- # new_release = CreateGithubRelease::Release.new('v0.1.0', Date.today, '...')
123
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
128
124
  #
129
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
125
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
130
126
  # changelog.body # => "## v0.1.0\n..."
131
127
  #
132
128
  # @example Changelog without front matter
@@ -135,9 +131,9 @@ module CreateGithubRelease
135
131
  # ...
136
132
  # CHANGELOG
137
133
  #
138
- # new_release = CreateGithubRelease::Release.new('v0.1.0', Date.today, '...')
134
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
139
135
  #
140
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
136
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
141
137
  # changelog.body # => "## v0.1.0\n..."
142
138
  #
143
139
  # @example Changelog without a body
@@ -145,26 +141,26 @@ module CreateGithubRelease
145
141
  # This is the front matter
146
142
  # CHANGELOG
147
143
  #
148
- # new_release = CreateGithubRelease::Release.new('v0.1.0', Date.today, '...')
144
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
149
145
  #
150
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
146
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
151
147
  # changelog.body # => ""
152
148
  #
153
149
  # @example An empty changelog (new line only)
154
150
  # changelog_text = <<~CHANGELOG
155
151
  # CHANGELOG
156
152
  #
157
- # new_release = CreateGithubRelease::Release.new('v0.1.0', Date.today, '...')
153
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
158
154
  #
159
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
155
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
160
156
  # changelog.body # => ""
161
157
  #
162
158
  # @example An empty changelog (empty string)
163
159
  # changelog_text = ""
164
160
  #
165
- # new_release = CreateGithubRelease::Release.new('v0.1.0', Date.today, '...')
161
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
166
162
  #
167
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
163
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
168
164
  # changelog.body # => ""
169
165
  #
170
166
  # @return [String] The body of the existing changelog
@@ -184,16 +180,14 @@ module CreateGithubRelease
184
180
  #
185
181
  attr_reader :existing_changelog
186
182
 
187
- # The new release to add to the changelog
183
+ # The description of the new release to add to the changelog
188
184
  #
189
185
  # @example
190
- # changelog.new_release.tag # => 'v1.0.0'
191
- # changelog.new_release.date # => #<Date: 2018-06-30>
192
- # changelog.new_release.description # => "[Full Changelog](...)..."
186
+ # changelog.next_release_description # => "# v1.0.0 - 2018-06-30\n\n[Full Changelog](...)..."
193
187
  #
194
- # @return [CreateGithubRelease::Release] The new release to add to the changelog
188
+ # @return [String] The description of the new release to add to the changelog
195
189
  #
196
- attr_reader :new_release
190
+ attr_reader :next_release_description
197
191
 
198
192
  # The changelog with the new release
199
193
  #
@@ -204,9 +198,7 @@ module CreateGithubRelease
204
198
  # ...
205
199
  # CHANGELOG
206
200
  #
207
- # new_release = CreateGithubRelease::Release.new(
208
- # 'v1.0.0', Date.parse('2022-11-08'), '...release description...'
209
- # )
201
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
210
202
  #
211
203
  # expected_changelog = <<~CHANGELOG
212
204
  # This is the front matter
@@ -218,7 +210,7 @@ module CreateGithubRelease
218
210
  # ...
219
211
  # CHANGELOG
220
212
  #
221
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
213
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
222
214
  #
223
215
  # changelog.to_s == expected_changelog # => true
224
216
  #
@@ -228,9 +220,7 @@ module CreateGithubRelease
228
220
  # ...
229
221
  # CHANGELOG
230
222
  #
231
- # new_release = CreateGithubRelease::Release.new(
232
- # 'v1.0.0', Date.parse('2022-11-08'), '...release description...'
233
- # )
223
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
234
224
  #
235
225
  # expected_changelog = <<~CHANGELOG
236
226
  # ## v1.0.0 (2022-11-08)
@@ -240,7 +230,7 @@ module CreateGithubRelease
240
230
  # ...
241
231
  # CHANGELOG
242
232
  #
243
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
233
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
244
234
  #
245
235
  # changelog.to_s == expected_changelog # => true
246
236
  #
@@ -249,9 +239,7 @@ module CreateGithubRelease
249
239
  # This is the front matter
250
240
  # CHANGELOG
251
241
  #
252
- # new_release = CreateGithubRelease::Release.new(
253
- # 'v1.0.0', Date.parse('2022-11-08'), '...release description...'
254
- # )
242
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
255
243
  #
256
244
  # expected_changelog = <<~CHANGELOG
257
245
  # This is the front matter
@@ -260,7 +248,7 @@ module CreateGithubRelease
260
248
  # ...release description...
261
249
  # CHANGELOG
262
250
  #
263
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
251
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
264
252
  #
265
253
  # changelog.to_s == expected_changelog # => true
266
254
  #
@@ -271,9 +259,7 @@ module CreateGithubRelease
271
259
  # ...
272
260
  # CHANGELOG
273
261
  #
274
- # new_release = CreateGithubRelease::Release.new(
275
- # 'v1.0.0', Date.parse('2022-11-08'), ''
276
- # )
262
+ # next_release_description = '## v1.0.0\n\n* 8374b31 Add FizzBuzz'
277
263
  #
278
264
  # expected_changelog = <<~CHANGELOG
279
265
  # This is the front matter
@@ -284,23 +270,32 @@ module CreateGithubRelease
284
270
  # ...
285
271
  # CHANGELOG
286
272
  #
287
- # changelog = CreateGithubRelease::Changelog.new(changelog_text, new_release)
273
+ # changelog = CreateGithubRelease::Changelog.new(changelog_text, next_release_description)
288
274
  #
289
275
  # changelog.to_s == expected_changelog # => true
290
276
  #
291
277
  # @return [String] The changelog with the new release details
292
278
  #
293
279
  def to_s
294
- String.new.tap do |changelog|
295
- changelog << "#{front_matter}\n\n" unless front_matter.empty?
296
- changelog << release_header
297
- changelog << release_description
298
- changelog << "\n#{body}\n" unless body.empty?
299
- end
280
+ formatted_front_matter + next_release_description + formatted_body
300
281
  end
301
282
 
302
283
  private
303
284
 
285
+ # The front matter formatted to insert into the changelog
286
+ # @return [String] The front matter formatted to insert into the changelog
287
+ # @api private
288
+ def formatted_front_matter
289
+ front_matter.empty? ? '' : "#{front_matter}\n\n"
290
+ end
291
+
292
+ # The body formatted to insert into the changelog
293
+ # @return [String] The body formatted to insert into the changelog
294
+ # @api private
295
+ def formatted_body
296
+ body.empty? ? '' : "\n#{body}\n"
297
+ end
298
+
304
299
  # The index of the line in @lines where the front matter begins
305
300
  # @return [Integer] The index of the line in @lines where the front matter begins
306
301
  # @api private
@@ -345,20 +340,6 @@ module CreateGithubRelease
345
340
  end
346
341
  end
347
342
 
348
- # The release header to output in the changelog
349
- # @return [String] The release header to output in the changelog
350
- # @api private
351
- def release_header
352
- "## #{new_release.tag} (#{new_release.date.strftime('%Y-%m-%d')})\n"
353
- end
354
-
355
- # The release description to output in the changelog
356
- # @return [String] The release description to output in the changelog
357
- # @api private
358
- def release_description
359
- new_release.description.empty? ? '' : "\n#{new_release.description.chomp}\n"
360
- end
361
-
362
343
  # Line number where the body of the changelog starts
363
344
  # @return [Integer] Line number where the body of the changelog starts
364
345
  # @api private