mj 1.1.0 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 89e001fe208b12ec28ecf985f50e778fcfc295171c28b5fbeff5329711aeb1bb
4
- data.tar.gz: 92b72966a17d0753e46823a5e7d6b4359b8753347d415025b4d3b40b5d5c8fd6
3
+ metadata.gz: 719a1dd98c88afa768cf64e3f898ef95535a2b11a1322bad42dd3adaa31cd378
4
+ data.tar.gz: 17980273bfabcf5b9b2378f7e0687de5c3fd2b4df412caa101ace15aab3ce266
5
5
  SHA512:
6
- metadata.gz: 83db7c1361d041476e30e1c8818f7d873603a27e0ab11d773b05d9603b3388fc374192ae5f37af6df430f42a5884860f982e45e09e97cec62c1ea343e3ca4408
7
- data.tar.gz: bf0ed35c9eb853c1e617abbeced2fa9b2e710cdca2f76ef853e538f4c5f64ccb9d131aaca9c93701b3e6790ed0a342ba144c8140145c4d43c7d3c7da37a24b1a
6
+ metadata.gz: 652fb4a8eb141689c29acfffb70666f1a17ca3acad33a888cd5e86ce2728def89959f3543cebd36e3587cd4227fc7166c7f677657ed9b20ee6b445b4f904fd8e
7
+ data.tar.gz: 1c9027cbde6e702272eee45edbbf5ad06392e527b32ff37454155541c455d5127a7013308dc38db414b78f4ef8b5d7ecd6c578f9d22b066ddfcb1c140d521f73
data/.rubocop.yml CHANGED
@@ -66,6 +66,9 @@ Style/GuardClause:
66
66
  Style/IfUnlessModifier:
67
67
  Enabled: false
68
68
 
69
+ Style/NegatedIf:
70
+ Enabled: false
71
+
69
72
  Style/StringLiterals:
70
73
  Enabled: true
71
74
  EnforcedStyle: double_quotes
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mj (1.1.0)
4
+ mj (1.2.0)
5
5
  colorize
6
6
  koine-rest_client
7
7
  mj-hash_utils
data/README.md CHANGED
@@ -38,6 +38,8 @@ bundle exec mj git delete_stale_branches \
38
38
  [--dry-run] \
39
39
  [--only-with-prs] \
40
40
  [--only-with-closed-prs] \
41
+ [--from-commiters=emal@one,email@two] \
42
+ [--from-pull_requestors=mjacobus,other-gh-username] \
41
43
  [--after-date=2021-01-01] \
42
44
  [--before-date=2021-01-01]
43
45
  ```
@@ -3,6 +3,7 @@
3
3
  require_relative "local_branch"
4
4
  require_relative "remote_branch"
5
5
  require_relative "pull_request"
6
+ require_relative "pull_request_author"
6
7
 
7
8
  module Mj
8
9
  module Git
@@ -45,6 +45,14 @@ module Mj
45
45
  def only_with_closed_prs
46
46
  @options[:only_with_closed_prs]
47
47
  end
48
+
49
+ def from_pull_requestors
50
+ @options[:from_pull_requestors].to_s.split(",")
51
+ end
52
+
53
+ def from_commiters
54
+ @options[:from_commiters].to_s.split(",")
55
+ end
48
56
  end
49
57
  end
50
58
  end
@@ -28,7 +28,7 @@ module Mj
28
28
 
29
29
  def delete_branch(branch, command:)
30
30
  if delete?(branch, command: command)
31
- puts("Deleting branch #{branch.name}", color: :green)
31
+ puts("Deleting branch #{branch.name} \t| #{branch.summary}", color: :green)
32
32
 
33
33
  unless command.dry_run?
34
34
  delete(branch)
@@ -36,29 +36,35 @@ module Mj
36
36
  end
37
37
  end
38
38
 
39
- def delete?(branch, command:) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
39
+ def delete?(branch, command:) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
40
40
  if %w[master main].include?(branch.to_local.name)
41
- puts("Skipping #{branch.name}. No, no, no, no.", color: :red)
41
+ puts("Skipping #{branch.summary}. No, no, no, no.", color: :red)
42
42
  return false
43
43
  end
44
44
 
45
45
  if branch.last_commit_date >= command.before_date
46
- puts("Skipping #{branch.name}. Not before #{command.before_date}.", color: :yellow)
47
- return false
46
+ return cannot_delete(branch, "Not before #{command.before_date}.")
48
47
  end
49
48
 
50
49
  if branch.last_commit_date < command.after_date
51
- puts("Skipping #{branch.name}. Not after #{command.after_date}.", color: :yellow)
50
+ return cannot_delete(branch, "Not after #{command.after_date}.")
51
+ end
52
+
53
+ unless commiter_check(command, branch)
52
54
  return false
53
55
  end
54
56
 
57
+ # PR checks later - more efficient. May not have to check them if any of the above is falsy
58
+
55
59
  if (command.only_with_prs || command.only_with_closed_prs) && branch.pr.nil?
56
- puts("Skipping #{branch.name}. Does not have PR.", color: :yellow)
57
- return false
60
+ return cannot_delete(branch, "Does not have a PR")
58
61
  end
59
62
 
60
63
  if command.only_with_closed_prs && !branch.pr.closed?
61
- puts("Skipping #{branch.name}. PR not closed - state: #{branch.pr.state}.", color: :yellow)
64
+ return cannot_delete(branch, "PR not closed - state: #{branch.pr.state}.")
65
+ end
66
+
67
+ unless pull_request_author_check(command, branch)
62
68
  return false
63
69
  end
64
70
 
@@ -71,6 +77,36 @@ module Mj
71
77
  puts("Could not delete branch #{branch.name}: #{exception.message}.", color: :red)
72
78
  end
73
79
 
80
+ def cannot_delete(branch, reason)
81
+ puts("Skipping #{branch.name} \t| #{reason}.", color: :yellow)
82
+
83
+ false
84
+ end
85
+
86
+ def pull_request_author_check(command, branch)
87
+ if command.from_pull_requestors.empty?
88
+ return true
89
+ end
90
+
91
+ if branch.has_pr? && command.from_pull_requestors.include?(branch.pr.author.login)
92
+ return true
93
+ end
94
+
95
+ cannot_delete(branch, "PR not from pull requestors: #{command.from_pull_requestors.join(", ")}.")
96
+ end
97
+
98
+ def commiter_check(command, branch)
99
+ if command.from_commiters.empty?
100
+ return true
101
+ end
102
+
103
+ if command.from_commiters.map(&:downcase).include?(branch.last_commiter_email.downcase)
104
+ return true
105
+ end
106
+
107
+ cannot_delete(branch, "PR not from commiters: #{command.from_commiters.join(", ")}.")
108
+ end
109
+
74
110
  def puts(string, color: nil)
75
111
  if color
76
112
  string = string.colorize(color)
@@ -5,14 +5,16 @@ module Mj
5
5
  class PullRequest
6
6
  attr_reader :number
7
7
  attr_reader :title
8
+ attr_reader :author
8
9
  attr_reader :state
9
10
  attr_reader :updated_at
10
11
 
11
- def initialize(number:, title:, state:, updated_at:)
12
+ def initialize(number:, title:, state:, updated_at:, author:)
12
13
  @number = number
13
14
  @title = title
14
15
  @state = state
15
16
  @updated_at = updated_at
17
+ @author = author
16
18
  end
17
19
 
18
20
  def closed?
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mj
4
+ module Git
5
+ class PullRequestAuthor
6
+ attr_reader :id
7
+ attr_reader :name
8
+ attr_reader :login
9
+ attr_reader :is_bot
10
+
11
+ def initialize(id:, name:, login:, is_bot:)
12
+ @id = id
13
+ @login = login
14
+ @name = name
15
+ @is_bot = is_bot
16
+ end
17
+ end
18
+ end
19
+ end
@@ -18,6 +18,14 @@ module Mj
18
18
  @last_commit_date ||= DateTime.parse(@command_executer.execute("git log -1 --format=%cd #{name}").first)
19
19
  end
20
20
 
21
+ def last_commiter_name
22
+ @last_commiter_name ||= @command_executer.execute("git log -1 --pretty=format:'%an' #{name}").first
23
+ end
24
+
25
+ def last_commiter_email
26
+ @last_commiter_email ||= @command_executer.execute("git log -1 --pretty=format:'%ae' #{name}").first
27
+ end
28
+
21
29
  def length
22
30
  @name.length
23
31
  end
@@ -30,6 +38,18 @@ module Mj
30
38
  !pr.nil?
31
39
  end
32
40
 
41
+ def summary
42
+ parts = []
43
+
44
+ parts << "Last Commited by #{last_commiter_name} (#{last_commiter_email}) on #{last_commit_date.strftime("%Y-%m-%d")}"
45
+
46
+ if @pr
47
+ parts << "PR ##{pr.number} by #{pr.author.login}"
48
+ end
49
+
50
+ parts.join(", ")
51
+ end
52
+
33
53
  # @return [Git::PullRequest]
34
54
  def pr
35
55
  if defined?(@pr)
@@ -50,12 +70,12 @@ module Mj
50
70
  name.sub(pattern, "")
51
71
  end
52
72
 
53
- def fetch_pr # rubocop:disable Metrics/MethodLength
73
+ def fetch_pr # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
54
74
  data = @command_executer.execute(
55
- "gh pr list --head #{local_branch_name} --state=all --json=number,state,title,updatedAt"
75
+ "gh pr list --head #{local_branch_name} --state=all --json=number,state,title,updatedAt,author"
56
76
  )
57
77
 
58
- data = JSON.parse(data.join("")).first
78
+ data = JSON.parse(data.join).first
59
79
 
60
80
  if data.nil?
61
81
  return
@@ -63,10 +83,16 @@ module Mj
63
83
 
64
84
  # I.E. ["14", "WIP on packer", "handle-packer-files", "DRAFT", "2022-03-14T20:14:17Z"]
65
85
  Git::PullRequest.new(
66
- number: data['number'],
67
- title: data['title'],
68
- state: data['state'],
69
- updated_at: DateTime.parse(data['updatedAt'])
86
+ number: data["number"],
87
+ title: data["title"],
88
+ state: data["state"],
89
+ updated_at: DateTime.parse(data["updatedAt"]),
90
+ author: PullRequestAuthor.new(
91
+ id: data.dig("author", "id"),
92
+ name: data.dig("author", "name"),
93
+ is_bot: data.dig("author", "is_bot"),
94
+ login: data.dig("author", "login")
95
+ )
70
96
  )
71
97
  rescue StandardError
72
98
  nil
@@ -38,6 +38,14 @@ module Mj
38
38
  type: :string,
39
39
  banner: "Formatted date YYY-MM-DD",
40
40
  aliases: :b
41
+ option :from_pull_requestors,
42
+ type: :string,
43
+ banner: "Comma separated github usernames",
44
+ aliases: :u
45
+ option :from_commiters,
46
+ type: :string,
47
+ banner: "Comma separated commiter emails - assumes last commiter",
48
+ aliases: :e
41
49
  def delete_stale_branches
42
50
  command = Commands::DeleteStaleBranchesCommand.new(options: options)
43
51
  handler = Commands::DeleteStaleBranchesCommandHandler.new(stdout: $stdout)
data/lib/mj/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mj
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mj
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcelo Jacobus
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-12-05 00:00:00.000000000 Z
11
+ date: 2024-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -141,6 +141,7 @@ files:
141
141
  - lib/mj/git/commands/delete_stale_branches_command_handler.rb
142
142
  - lib/mj/git/local_branch.rb
143
143
  - lib/mj/git/pull_request.rb
144
+ - lib/mj/git/pull_request_author.rb
144
145
  - lib/mj/git/remote_branch.rb
145
146
  - lib/mj/git/thor_command.rb
146
147
  - lib/mj/graphql/client.rb
@@ -162,7 +163,7 @@ metadata:
162
163
  source_code_uri: https://github.com/mjacobus/mj
163
164
  changelog_uri: https://github.com/mjacobus/mj/blob/main/CHANGELOG.md
164
165
  rubygems_mfa_required: 'true'
165
- post_install_message:
166
+ post_install_message:
166
167
  rdoc_options: []
167
168
  require_paths:
168
169
  - lib
@@ -177,8 +178,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
178
  - !ruby/object:Gem::Version
178
179
  version: '0'
179
180
  requirements: []
180
- rubygems_version: 3.4.10
181
- signing_key:
181
+ rubygems_version: 3.5.14
182
+ signing_key:
182
183
  specification_version: 4
183
184
  summary: My personal CLI
184
185
  test_files: []