gem_comet 0.3.0 → 0.7.2
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/.circleci/config.yml +16 -18
- data/.dependabot/config.yml +18 -0
- data/.gem_comet.yml +8 -0
- data/.rubocop.yml +2 -2
- data/.rubocop_challenge.yml +3 -0
- data/.rubocop_todo.yml +16 -1
- data/CHANGELOG.md +110 -14
- data/Gemfile.lock +59 -47
- data/README.md +4 -0
- data/gem_comet.gemspec +4 -2
- data/lib/gem_comet.rb +9 -2
- data/lib/gem_comet/bundle_updater.rb +14 -0
- data/lib/gem_comet/changelog.rb +7 -17
- data/lib/gem_comet/changelog/generator.rb +49 -21
- data/lib/gem_comet/changelog/initializer.rb +24 -0
- data/lib/gem_comet/cli.rb +17 -12
- data/lib/gem_comet/git_command.rb +46 -0
- data/lib/gem_comet/open_github_pulls_page.rb +18 -0
- data/lib/gem_comet/release.rb +4 -2
- data/lib/gem_comet/release/{release_pr.rb → create_release_pr.rb} +15 -2
- data/lib/gem_comet/release/{update_pr.rb → create_update_pr.rb} +15 -8
- data/lib/gem_comet/repository_url.rb +25 -0
- data/lib/gem_comet/service_abstract.rb +4 -4
- data/lib/gem_comet/verify_git_condition.rb +45 -0
- data/lib/gem_comet/version.rb +1 -1
- data/lib/gem_comet/version_history.rb +67 -0
- data/renovate.json +5 -0
- data/template/.gem_comet.yml.erb +3 -0
- data/template/release_pr.md.erb +5 -0
- data/template/update_pr.md.erb +6 -0
- metadata +24 -12
data/README.md
CHANGED
data/gem_comet.gemspec
CHANGED
@@ -22,7 +22,9 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
|
25
|
-
spec.
|
25
|
+
spec.required_ruby_version = '>= 2.7.0'
|
26
|
+
|
27
|
+
spec.add_runtime_dependency 'pr_comet', '~> 0.4.0'
|
26
28
|
spec.add_runtime_dependency 'thor'
|
27
29
|
spec.add_runtime_dependency 'type_struct'
|
28
30
|
|
@@ -34,6 +36,6 @@ Gem::Specification.new do |spec|
|
|
34
36
|
spec.add_development_dependency 'rubocop'
|
35
37
|
spec.add_development_dependency 'rubocop-performance'
|
36
38
|
spec.add_development_dependency 'rubocop-rspec'
|
37
|
-
spec.add_development_dependency 'simplecov'
|
39
|
+
spec.add_development_dependency 'simplecov', '0.17.1'
|
38
40
|
spec.add_development_dependency 'yard'
|
39
41
|
end
|
data/lib/gem_comet.rb
CHANGED
@@ -8,11 +8,18 @@ require 'yaml'
|
|
8
8
|
require 'gem_comet/version'
|
9
9
|
require 'gem_comet/service_abstract'
|
10
10
|
require 'gem_comet/config'
|
11
|
+
require 'gem_comet/git_command'
|
12
|
+
require 'gem_comet/bundle_updater'
|
11
13
|
require 'gem_comet/version_editor'
|
14
|
+
require 'gem_comet/version_history'
|
12
15
|
require 'gem_comet/changelog'
|
16
|
+
require 'gem_comet/changelog/initializer'
|
13
17
|
require 'gem_comet/changelog/editor'
|
14
18
|
require 'gem_comet/changelog/generator'
|
19
|
+
require 'gem_comet/open_github_pulls_page'
|
20
|
+
require 'gem_comet/repository_url'
|
15
21
|
require 'gem_comet/release'
|
16
|
-
require 'gem_comet/release/
|
17
|
-
require 'gem_comet/release/
|
22
|
+
require 'gem_comet/release/create_update_pr'
|
23
|
+
require 'gem_comet/release/create_release_pr'
|
24
|
+
require 'gem_comet/verify_git_condition'
|
18
25
|
require 'gem_comet/cli'
|
data/lib/gem_comet/changelog.rb
CHANGED
@@ -3,29 +3,19 @@
|
|
3
3
|
module GemComet
|
4
4
|
# Generates changelog from git log
|
5
5
|
class Changelog < ServiceAbstract
|
6
|
-
# @param
|
7
|
-
#
|
8
|
-
#
|
9
|
-
|
10
|
-
# The end of version number to create a changelog.
|
11
|
-
# Default is specified `HEAD`.
|
12
|
-
# @param append [Boolean]
|
13
|
-
# Appends execution result to CHANGELOG.md.
|
14
|
-
# @param prepend [Boolean]
|
15
|
-
# Prepends execution result to CHANGELOG.md.
|
16
|
-
def initialize(from_version: nil, to_version: nil, append: false, prepend: false)
|
17
|
-
@version_editor = VersionEditor.new
|
6
|
+
# @param version [String] The version number to create a changelog.
|
7
|
+
# @param append [Boolean] Appends execution result to CHANGELOG.md.
|
8
|
+
# @param prepend [Boolean] Prepends execution result to CHANGELOG.md.
|
9
|
+
def initialize(version:, append: false, prepend: false)
|
18
10
|
@changelog_editor = Changelog::Editor.new
|
19
|
-
@
|
20
|
-
@to_version = to_version
|
11
|
+
@version = version
|
21
12
|
@append = append
|
22
13
|
@prepend = prepend
|
23
14
|
end
|
24
15
|
|
25
16
|
private
|
26
17
|
|
27
|
-
attr_reader :
|
28
|
-
:from_version, :to_version, :append, :prepend
|
18
|
+
attr_reader :changelog_editor, :version, :append, :prepend
|
29
19
|
|
30
20
|
# Displays changelogs. If specified a `append` or `prepend` option, updates
|
31
21
|
# CHANGELOG.md with generated changelog.
|
@@ -44,7 +34,7 @@ module GemComet
|
|
44
34
|
#
|
45
35
|
# @return [String] Ganalated changelog
|
46
36
|
def changelog
|
47
|
-
@changelog ||= Generator.call(
|
37
|
+
@changelog ||= Generator.call(version: version)
|
48
38
|
end
|
49
39
|
end
|
50
40
|
end
|
@@ -4,17 +4,14 @@ module GemComet
|
|
4
4
|
class Changelog
|
5
5
|
# Generates changelog from git log
|
6
6
|
class Generator < ServiceAbstract
|
7
|
-
attr_reader :
|
8
|
-
|
9
|
-
# @param
|
10
|
-
# @param
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
@from = "v#{from_version}"
|
16
|
-
@to = to_version.nil? ? 'HEAD' : "v#{to_version}"
|
17
|
-
@new_version = new_version || to
|
7
|
+
attr_reader :version, :title, :origin_url
|
8
|
+
|
9
|
+
# @param version [String] The end of version number to create a changelog.
|
10
|
+
# @param title [String] Next version of your gem
|
11
|
+
def initialize(version:, title: nil)
|
12
|
+
@version = version
|
13
|
+
@title = title || version
|
14
|
+
@origin_url = RepositoryUrl.call
|
18
15
|
end
|
19
16
|
|
20
17
|
private
|
@@ -24,10 +21,11 @@ module GemComet
|
|
24
21
|
# Returns changelogs as markdown format from current version to HEAD commit.
|
25
22
|
#
|
26
23
|
# @return [String] Changelogs as markdown format
|
24
|
+
# @raise [RuntimeError] The specified version cannot be found
|
27
25
|
def call
|
28
26
|
<<~MARKDOWN
|
29
27
|
|
30
|
-
## #{
|
28
|
+
## #{title} (#{versioning_date})
|
31
29
|
|
32
30
|
### Feature
|
33
31
|
### Bugfix
|
@@ -38,6 +36,13 @@ module GemComet
|
|
38
36
|
MARKDOWN
|
39
37
|
end
|
40
38
|
|
39
|
+
# Returns the versioning date
|
40
|
+
#
|
41
|
+
# @return [String] The versioning date. e.g. "Oct 26, 2019"
|
42
|
+
def versioning_date
|
43
|
+
VersionHistory.new.versioning_date_of(version).strftime('%b %d, %Y')
|
44
|
+
end
|
45
|
+
|
41
46
|
# Returns array of changelogs as markdown format.
|
42
47
|
#
|
43
48
|
# @return [Array<String>] Array of changelogs as markdown format
|
@@ -45,14 +50,29 @@ module GemComet
|
|
45
50
|
merge_commits.map do |merge_commit|
|
46
51
|
next unless merge_commit.match?(MERGE_COMMIT_TITLE)
|
47
52
|
|
48
|
-
|
49
|
-
|
50
|
-
|
53
|
+
number = extract_pull_request_number(merge_commit)
|
54
|
+
title = extract_description(merge_commit) || extract_branch_name(merge_commit)
|
55
|
+
author = extract_author_name(merge_commit)
|
51
56
|
|
52
|
-
|
57
|
+
generate_changelog(number, title, author)
|
53
58
|
end.compact
|
54
59
|
end
|
55
60
|
|
61
|
+
# Generates changelog message as markdown list
|
62
|
+
#
|
63
|
+
# @param number [Integer] The pull request number
|
64
|
+
# @param title [String] The pull request title
|
65
|
+
# @param author [String] The author of the PR
|
66
|
+
# @return [String] Changelog message as markdown list
|
67
|
+
def generate_changelog(number, title, author)
|
68
|
+
[
|
69
|
+
'*',
|
70
|
+
"[##{number}](#{get_pull_request_url(number)})",
|
71
|
+
title,
|
72
|
+
"([@#{author}](https://github.com/#{author}))"
|
73
|
+
].join(' ')
|
74
|
+
end
|
75
|
+
|
56
76
|
# Extracts PR number from merge commit string.
|
57
77
|
#
|
58
78
|
# @param merge_commit [String] The target string
|
@@ -87,6 +107,14 @@ module GemComet
|
|
87
107
|
MERGE_COMMIT_TITLE.match(merge_commit).captures.last.chomp.strip
|
88
108
|
end
|
89
109
|
|
110
|
+
# Extracts the author of the PR from merge commit string.
|
111
|
+
#
|
112
|
+
# @param merge_commit [String] The target string
|
113
|
+
# @return [String] Author name
|
114
|
+
def extract_author_name(merge_commit)
|
115
|
+
extract_branch_name(merge_commit).split('/').first
|
116
|
+
end
|
117
|
+
|
90
118
|
# Parces the merge commit log, which to separate by each commit.
|
91
119
|
#
|
92
120
|
# @return [Array<String>] Array of git commit log
|
@@ -98,14 +126,14 @@ module GemComet
|
|
98
126
|
#
|
99
127
|
# @return [String] Get only merge commit logs
|
100
128
|
def merge_commit_log
|
101
|
-
@merge_commit_log ||= `git log --merges #{
|
129
|
+
@merge_commit_log ||= `git log --merges #{prev_version}..#{version}`
|
102
130
|
end
|
103
131
|
|
104
|
-
#
|
132
|
+
# Get a previous version number from the specified version number
|
105
133
|
#
|
106
|
-
# @
|
107
|
-
def
|
108
|
-
@
|
134
|
+
# @raise [RuntimeError] The specified version cannot be found
|
135
|
+
def prev_version
|
136
|
+
@prev_version ||= VersionHistory.new.previous_version_from(version)
|
109
137
|
end
|
110
138
|
end
|
111
139
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GemComet
|
4
|
+
class Changelog
|
5
|
+
# Initializes the CHANGELOG.md to append past version change-logs
|
6
|
+
class Initializer < ServiceAbstract
|
7
|
+
def initialize
|
8
|
+
@changelog_editor = Changelog::Editor.new
|
9
|
+
@version_history = VersionHistory.new
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
attr_reader :changelog_editor, :version_history
|
15
|
+
|
16
|
+
def call
|
17
|
+
version_history.versions.each do |version|
|
18
|
+
changelog = Changelog::Generator.call(version: version)
|
19
|
+
changelog_editor.prepend!(content: changelog)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/gem_comet/cli.rb
CHANGED
@@ -14,24 +14,26 @@ module GemComet
|
|
14
14
|
template '../../template/.gem_comet.yml.erb', '.gem_comet.yml',
|
15
15
|
version: GemComet::Config::CURRENT_VERSION
|
16
16
|
template '../../template/CHANGELOG.md.erb', 'CHANGELOG.md'
|
17
|
+
Changelog::Initializer.call
|
18
|
+
rescue StandardError => e
|
19
|
+
puts e.message
|
17
20
|
end
|
18
21
|
|
19
22
|
desc 'release VERSION', 'Creates update PR and release PR'
|
20
23
|
def release(version)
|
21
24
|
Release.call(version: version)
|
25
|
+
rescue StandardError => e
|
26
|
+
puts e.message
|
22
27
|
end
|
23
28
|
|
24
29
|
desc 'changelog', 'Displays changelogs'
|
25
|
-
option :
|
30
|
+
option :version,
|
26
31
|
type: :string,
|
27
|
-
aliases: :
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
aliases: :t,
|
33
|
-
desc: 'The end of version number to create a changelog. ' \
|
34
|
-
'Default is specified `HEAD`.'
|
32
|
+
aliases: :v,
|
33
|
+
default: 'HEAD',
|
34
|
+
desc: 'The version number to create a changelog. ' \
|
35
|
+
'Default is specified `HEAD`.',
|
36
|
+
banner: 'v1.2.3'
|
35
37
|
option :append,
|
36
38
|
type: :boolean,
|
37
39
|
aliases: :a,
|
@@ -44,16 +46,19 @@ module GemComet
|
|
44
46
|
desc: 'Prepends execution result to CHANGELOG.md.'
|
45
47
|
def changelog
|
46
48
|
puts Changelog.call(
|
47
|
-
|
48
|
-
to_version: options[:to],
|
49
|
+
version: options[:version],
|
49
50
|
append: options[:append],
|
50
51
|
prepend: options[:prepend]
|
51
52
|
)
|
53
|
+
rescue StandardError => e
|
54
|
+
puts e.message
|
52
55
|
end
|
53
56
|
|
54
57
|
desc 'versions', 'Displays version numbers of your gem.'
|
55
58
|
def versions
|
56
|
-
puts
|
59
|
+
puts VersionHistory.new.versions
|
60
|
+
rescue StandardError => e
|
61
|
+
puts e.message
|
57
62
|
end
|
58
63
|
|
59
64
|
desc 'version', 'Shows current version'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GemComet
|
4
|
+
# Executes git command
|
5
|
+
class GitCommand
|
6
|
+
def initialize; end
|
7
|
+
|
8
|
+
# Get uncommitted files
|
9
|
+
#
|
10
|
+
# @return [Array<String>] Uncommitted files
|
11
|
+
def uncommitted_files
|
12
|
+
git_status_short.lines.map(&:chomp)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Get current git branch name
|
16
|
+
#
|
17
|
+
# @return [String] The current branch name
|
18
|
+
def current_branch
|
19
|
+
run 'rev-parse', '--abbrev-ref', 'HEAD'
|
20
|
+
end
|
21
|
+
|
22
|
+
def checkout(branch)
|
23
|
+
run 'checkout', branch
|
24
|
+
end
|
25
|
+
|
26
|
+
# Executes `$ git pull`
|
27
|
+
def pull
|
28
|
+
run 'pull'
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def execute(command)
|
34
|
+
`#{command}`.chomp
|
35
|
+
end
|
36
|
+
|
37
|
+
def run(*subcommands)
|
38
|
+
command = "git #{subcommands.join(' ')}"
|
39
|
+
execute(command)
|
40
|
+
end
|
41
|
+
|
42
|
+
def git_status_short
|
43
|
+
run 'status', '--short'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GemComet
|
4
|
+
# Creates pull requests for gem release and that preparation
|
5
|
+
class OpenGithubPullsPage < ServiceAbstract
|
6
|
+
attr_reader :origin_url
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@origin_url = RepositoryUrl.call
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def call
|
15
|
+
`open #{origin_url}/pulls`
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/gem_comet/release.rb
CHANGED
@@ -15,8 +15,10 @@ module GemComet
|
|
15
15
|
attr_reader :version, :config
|
16
16
|
|
17
17
|
def call
|
18
|
-
|
19
|
-
|
18
|
+
VerifyGitCondition.call
|
19
|
+
CreateUpdatePR.call(**update_pr_args)
|
20
|
+
CreateReleasePR.call(**release_pr_args)
|
21
|
+
OpenGithubPullsPage.call
|
20
22
|
end
|
21
23
|
|
22
24
|
def update_pr_args
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module GemComet
|
4
4
|
class Release
|
5
5
|
# Creates a pull request for your gem release
|
6
|
-
class
|
6
|
+
class CreateReleasePR < ServiceAbstract
|
7
7
|
private
|
8
8
|
|
9
9
|
attr_reader :version, :pr_comet
|
@@ -18,7 +18,20 @@ module GemComet
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def create_pull_request
|
21
|
-
pr_comet.create!(
|
21
|
+
pr_comet.create!(
|
22
|
+
title: "Release v#{version}",
|
23
|
+
body: pull_request_body,
|
24
|
+
validate: false
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def pull_request_body
|
29
|
+
template = File.read(template_file_path)
|
30
|
+
ERB.new(template, trim_mode: '-').result(binding)
|
31
|
+
end
|
32
|
+
|
33
|
+
def template_file_path
|
34
|
+
File.expand_path('../../../template/release_pr.md.erb', __dir__)
|
22
35
|
end
|
23
36
|
end
|
24
37
|
end
|
@@ -3,17 +3,18 @@
|
|
3
3
|
module GemComet
|
4
4
|
class Release
|
5
5
|
# Creates a pull request for release preparation
|
6
|
-
class
|
6
|
+
class CreateUpdatePR < ServiceAbstract
|
7
7
|
def initialize(version:, base_branch:)
|
8
8
|
@version = version
|
9
9
|
@pr_comet = PrComet.new(base: base_branch, branch: "update/v#{version}")
|
10
10
|
@version_editor = VersionEditor.new
|
11
|
+
@prev_version = version_editor.current_version
|
11
12
|
@changelog_editor = Changelog::Editor.new
|
12
13
|
end
|
13
14
|
|
14
15
|
private
|
15
16
|
|
16
|
-
attr_reader :version, :pr_comet, :version_editor, :changelog_editor
|
17
|
+
attr_reader :version, :prev_version, :pr_comet, :version_editor, :changelog_editor
|
17
18
|
|
18
19
|
def call
|
19
20
|
update_changelog
|
@@ -24,10 +25,7 @@ module GemComet
|
|
24
25
|
|
25
26
|
def update_changelog
|
26
27
|
pr_comet.commit ':comet: Update CHANGELOG.md' do
|
27
|
-
changelog = Changelog::Generator.call(
|
28
|
-
from_version: version_editor.current_version,
|
29
|
-
new_version: version
|
30
|
-
)
|
28
|
+
changelog = Changelog::Generator.call(version: 'HEAD', title: "v#{version}")
|
31
29
|
changelog_editor.prepend!(content: changelog)
|
32
30
|
end
|
33
31
|
end
|
@@ -39,11 +37,20 @@ module GemComet
|
|
39
37
|
end
|
40
38
|
|
41
39
|
def bundle_update
|
42
|
-
pr_comet.commit(':comet: $ bundle update') {
|
40
|
+
pr_comet.commit(':comet: $ bundle update') { BundleUpdater.call }
|
43
41
|
end
|
44
42
|
|
45
43
|
def create_pull_request
|
46
|
-
pr_comet.create!(title: "Update v#{version}", body:
|
44
|
+
pr_comet.create!(title: "Update v#{version}", body: pull_request_body)
|
45
|
+
end
|
46
|
+
|
47
|
+
def pull_request_body
|
48
|
+
template = File.read(template_file_path)
|
49
|
+
ERB.new(template, trim_mode: '-').result(binding)
|
50
|
+
end
|
51
|
+
|
52
|
+
def template_file_path
|
53
|
+
File.expand_path('../../../template/update_pr.md.erb', __dir__)
|
47
54
|
end
|
48
55
|
end
|
49
56
|
end
|