git_helper 3.3.1 → 3.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +32 -9
  4. data/Guardfile +3 -1
  5. data/README.md +4 -4
  6. data/Rakefile +2 -0
  7. data/bin/git-helper +18 -13
  8. data/lib/git_helper.rb +6 -2
  9. data/lib/git_helper/change_remote.rb +15 -6
  10. data/lib/git_helper/checkout_default.rb +2 -0
  11. data/lib/git_helper/clean_branches.rb +2 -0
  12. data/lib/git_helper/code_request.rb +33 -19
  13. data/lib/git_helper/empty_commit.rb +2 -0
  14. data/lib/git_helper/forget_local_commits.rb +2 -0
  15. data/lib/git_helper/git_config_reader.rb +3 -5
  16. data/lib/git_helper/gitlab_client.rb +2 -0
  17. data/lib/git_helper/local_code.rb +18 -8
  18. data/lib/git_helper/merge_request.rb +90 -70
  19. data/lib/git_helper/new_branch.rb +3 -1
  20. data/lib/git_helper/octokit_client.rb +2 -0
  21. data/lib/git_helper/pull_request.rb +97 -66
  22. data/lib/git_helper/setup.rb +52 -32
  23. data/lib/git_helper/version.rb +3 -1
  24. data/spec/git_helper/change_remote_spec.rb +24 -24
  25. data/spec/git_helper/checkout_default_spec.rb +2 -0
  26. data/spec/git_helper/clean_branches_spec.rb +2 -0
  27. data/spec/git_helper/code_request_spec.rb +30 -28
  28. data/spec/git_helper/empty_commit_spec.rb +2 -0
  29. data/spec/git_helper/forget_local_commits_spec.rb +2 -0
  30. data/spec/git_helper/git_config_reader_spec.rb +4 -2
  31. data/spec/git_helper/gitlab_client_spec.rb +2 -0
  32. data/spec/git_helper/local_code_spec.rb +2 -0
  33. data/spec/git_helper/merge_request_spec.rb +24 -23
  34. data/spec/git_helper/new_branch_spec.rb +10 -8
  35. data/spec/git_helper/octokit_client_spec.rb +2 -0
  36. data/spec/git_helper/pull_request_spec.rb +20 -18
  37. data/spec/git_helper/setup_spec.rb +34 -26
  38. data/spec/spec_helper.rb +4 -1
  39. metadata +34 -9
  40. data/lib/git_helper/highline_cli.rb +0 -33
  41. data/spec/git_helper/highline_cli_spec.rb +0 -51
@@ -1,77 +1,95 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitHelper
2
4
  class Setup
3
5
  def execute
6
+ execute_config_file
7
+ execute_plugins
8
+ end
9
+
10
+ # rubocop:disable Style/ConditionalAssignment
11
+ private def execute_config_file
4
12
  if config_file_exists?
5
- answer = highline.ask_yes_no("It looks like the #{config_file} file already exists. Do you wish to replace it? (y/n)")
6
- puts
13
+ answer = highline.ask_yes_no(
14
+ "It looks like the #{config_file} file already exists. Do you wish to replace it? (y/n)",
15
+ { required: true }
16
+ )
7
17
  else
8
18
  answer = true
9
19
  end
10
20
 
11
21
  create_or_update_config_file if answer
22
+ end
23
+ # rubocop:enable Style/ConditionalAssignment
12
24
 
25
+ private def execute_plugins
13
26
  answer = highline.ask_yes_no(
14
- "Do you wish to set up the Git Helper plugins? (y/n) (This process will " \
15
- "attempt to use your GitHub personal access token to authenticate)"
27
+ 'Do you wish to set up the Git Helper plugins? (y/n) (This process will ' \
28
+ 'attempt to use your GitHub personal access token to authenticate)',
29
+ { required: true }
16
30
  )
17
31
 
18
- if answer
19
- create_or_update_plugin_files
20
- puts "\nNow add this line to your ~/.bash_profile:\n export PATH=/path/to/computer/home/.git_helper/plugins:$PATH"
21
- puts "\nDone!"
22
- end
32
+ return unless answer
33
+
34
+ create_or_update_plugin_files
35
+ puts "\nNow add this line to your ~/.bash_profile:\n" \
36
+ ' export PATH=/path/to/computer/home/.git_helper/plugins:$PATH'
37
+ puts "\nDone!"
23
38
  end
24
39
 
25
40
  private def create_or_update_config_file
26
41
  contents = generate_file_contents
27
- puts "\nCreating or updating your #{config_file} file..."
42
+ puts "Creating or updating your #{config_file} file..."
28
43
  File.open(config_file, 'w') { |file| file.puts contents }
29
44
  puts "\nDone!\n\n"
30
45
  end
31
46
 
32
47
  private def config_file_exists?
33
- File.exists?(config_file)
48
+ File.exist?(config_file)
34
49
  end
35
50
 
51
+ # rubocop:disable Metrics/MethodLength
36
52
  private def generate_file_contents
37
- file_contents = ''
53
+ file_contents = ''.dup
38
54
 
39
- if highline.ask_yes_no("Do you wish to set up GitHub credentials? (y/n)")
55
+ if highline.ask_yes_no('Do you wish to set up GitHub credentials? (y/n)', { required: true })
40
56
  file_contents << ":github_user: #{ask_question('GitHub username?')}\n"
41
- file_contents << ":github_token: " \
42
- "#{ask_question('GitHub personal access token? (Navigate to https://github.com/settings/tokens ' \
43
- 'to create a new personal access token)')}\n"
57
+ file_contents << ':github_token: ' \
58
+ "#{ask_question(
59
+ 'GitHub personal access token? (Navigate to https://github.com/settings/tokens ' \
60
+ 'to create a new personal access token)',
61
+ secret: true
62
+ )}\n"
44
63
  end
45
64
 
46
- if highline.ask_yes_no("\nDo you wish to set up GitLab credentials? (y/n)")
65
+ if highline.ask_yes_no('Do you wish to set up GitLab credentials? (y/n)', { required: true })
47
66
  file_contents << ":gitlab_user: #{ask_question('GitLab username?')}\n"
48
- file_contents << ":gitlab_token: " \
49
- "#{ask_question('GitLab personal access token? (Navigate to https://gitlab.com/-/profile/personal_access_tokens ' \
50
- 'to create a new personal access token)')}\n"
67
+ file_contents << ':gitlab_token: ' \
68
+ "#{ask_question(
69
+ 'GitLab personal access token? (Navigate to https://gitlab.com/-/profile/personal_access_tokens' \
70
+ ' to create a new personal access token)',
71
+ secret: true
72
+ )}\n"
51
73
  end
52
74
 
53
75
  file_contents.strip
54
76
  end
77
+ # rubocop:enable Metrics/MethodLength
55
78
 
56
- private def ask_question(prompt)
57
- answer = highline.ask("\n#{prompt}")
58
-
59
- if answer.empty?
60
- puts "\nThis question is required."
61
- ask_question(prompt)
62
- else
63
- answer
64
- end
79
+ private def ask_question(prompt, secret: false)
80
+ highline.ask(prompt, { required: true, secret: secret })
65
81
  end
66
82
 
83
+ # rubocop:disable Metrics/MethodLength
84
+ # rubocop:disable Metrics/AbcSize
67
85
  private def create_or_update_plugin_files
68
- plugins_dir = "#{Dir.pwd.scan(/\A\/[\w]*\/[\w]*\//).first}/.git_helper/plugins"
86
+ plugins_dir = "#{Dir.pwd.scan(%r{\A/\w*/\w*/}).first}.git_helper/plugins"
69
87
  plugins_url = 'https://api.github.com/repos/emmahsax/git_helper/contents/plugins'
70
88
  header = 'Accept: application/vnd.github.v3.raw'
71
89
  token = git_config_reader.github_token
72
90
  user = git_config_reader.github_user
73
91
 
74
- Dir.mkdir(plugins_dir) unless File.exists?(plugins_dir)
92
+ Dir.mkdir(plugins_dir) unless File.exist?(plugins_dir)
75
93
 
76
94
  all_plugins = JSON.parse(`curl -s -u #{user}:#{token} -H "#{header}" -L "#{plugins_url}"`)
77
95
 
@@ -80,6 +98,8 @@ module GitHelper
80
98
  File.open("#{plugins_dir}/#{plugin['name']}", 'w') { |file| file.puts plugin_content }
81
99
  end
82
100
  end
101
+ # rubocop:enable Metrics/MethodLength
102
+ # rubocop:enable Metrics/AbcSize
83
103
 
84
104
  private def config_file
85
105
  git_config_reader.git_config_file_path
@@ -90,7 +110,7 @@ module GitHelper
90
110
  end
91
111
 
92
112
  private def highline
93
- @highline ||= GitHelper::HighlineCli.new
113
+ @highline ||= HighlineWrapper.new
94
114
  end
95
115
  end
96
116
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GitHelper
2
- VERSION = '3.3.1'
4
+ VERSION = '3.3.6'
3
5
  end
@@ -1,30 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
4
6
  describe GitHelper::ChangeRemote do
5
7
  let(:remote1) { "git@github.com:#{old_owner}/#{project}.git" }
6
8
  let(:project) { Faker::Lorem.word }
7
- let(:cli) { double(:highline_cli, ask_yes_no: true) }
9
+ let(:highline_wrapper) { double(:highline_wrapper, ask_yes_no: true) }
8
10
  let(:old_owner) { Faker::Internet.username }
9
11
  let(:new_owner) { Faker::Internet.username }
10
- let(:directory_entries) { [ '.', '..', project, Faker::Lorem.word, Faker::Lorem.word ] }
12
+ let(:directory_entries) { ['.', '..', project, Faker::Lorem.word, Faker::Lorem.word] }
11
13
 
12
14
  let(:local_code) do
13
15
  double(:local_code,
14
- remotes: [remote1],
15
- remote_name: Faker::Lorem.word,
16
- ssh_remote?: true,
17
- https_remote?: false,
18
- remote_project: project,
19
- remote_source: 'github.com',
20
- change_remote: true
21
- )
16
+ remotes: [remote1],
17
+ remote_name: Faker::Lorem.word,
18
+ ssh_remote?: true,
19
+ https_remote?: false,
20
+ remote_project: project,
21
+ remote_source: 'github.com',
22
+ change_remote: true)
22
23
  end
23
24
 
24
25
  subject { GitHelper::ChangeRemote.new(old_owner, new_owner) }
25
26
 
26
27
  before do
27
- allow(GitHelper::HighlineCli).to receive(:new).and_return(cli)
28
+ allow(HighlineWrapper).to receive(:new).and_return(highline_wrapper)
28
29
  allow(GitHelper::LocalCode).to receive(:new).and_return(local_code)
29
30
  allow(subject).to receive(:puts)
30
31
  end
@@ -73,7 +74,7 @@ describe GitHelper::ChangeRemote do
73
74
  end
74
75
 
75
76
  context 'when the user says not to process the directory' do
76
- let(:cli) { double(:highline_cli, ask_yes_no: false) }
77
+ let(:highline_wrapper) { double(:highline_wrapper, ask_yes_no: false) }
77
78
 
78
79
  it 'should not call to process the directory' do
79
80
  expect(subject).not_to receive(:process_git_repository)
@@ -138,14 +139,13 @@ describe GitHelper::ChangeRemote do
138
139
  context 'https remote' do
139
140
  let(:local_code) do
140
141
  double(:local_code,
141
- remotes: [remote1],
142
- remote_name: Faker::Lorem.word,
143
- ssh_remote?: false,
144
- https_remote?: false,
145
- remote_project: project,
146
- remote_source: 'github.com',
147
- change_remote: true
148
- )
142
+ remotes: [remote1],
143
+ remote_name: Faker::Lorem.word,
144
+ ssh_remote?: false,
145
+ https_remote?: false,
146
+ remote_project: project,
147
+ remote_source: 'github.com',
148
+ change_remote: true)
149
149
  end
150
150
 
151
151
  it 'should ask if the remote is SSH' do
@@ -167,10 +167,10 @@ describe GitHelper::ChangeRemote do
167
167
  end
168
168
  end
169
169
 
170
- describe '#cli' do
171
- it 'should create a new highline CLI instance' do
172
- expect(GitHelper::HighlineCli).to receive(:new)
173
- subject.send(:cli)
170
+ describe '#highline' do
171
+ it 'should create a new highline_wrapper instance' do
172
+ expect(HighlineWrapper).to receive(:new)
173
+ subject.send(:highline)
174
174
  end
175
175
  end
176
176
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
4
6
  describe GitHelper::CodeRequest do
5
- let(:highline_cli) { double(:highline_cli) }
7
+ let(:highline_wrapper) { double(:highline_wrapper) }
6
8
  let(:local_code) { double(:local_code, project_name: Faker::Lorem.word, branch: Faker::Lorem.word) }
7
9
  let(:process_project) { double(:process_project, create: :created, merge: :merged) }
8
10
  let(:base_branch) { Faker::Lorem.word }
@@ -12,7 +14,7 @@ describe GitHelper::CodeRequest do
12
14
 
13
15
  before do
14
16
  allow(GitHelper::LocalCode).to receive(:new).and_return(local_code)
15
- allow(GitHelper::HighlineCli).to receive(:new).and_return(highline_cli)
17
+ allow(HighlineWrapper).to receive(:new).and_return(highline_wrapper)
16
18
  allow(subject).to receive(:puts)
17
19
  end
18
20
 
@@ -101,19 +103,19 @@ describe GitHelper::CodeRequest do
101
103
 
102
104
  describe '#ask_for_clarification' do
103
105
  it 'should ask the CLI' do
104
- expect(highline_cli).to receive(:ask).and_return('github')
106
+ expect(highline_wrapper).to receive(:ask).and_return('github')
105
107
  subject.send(:ask_for_clarification)
106
108
  end
107
109
 
108
110
  context 'when response is github' do
109
111
  it 'should return github_pull_request' do
110
- allow(highline_cli).to receive(:ask).and_return('github')
112
+ allow(highline_wrapper).to receive(:ask).and_return('github')
111
113
  expect(subject).to receive(:github_pull_request)
112
114
  subject.send(:ask_for_clarification)
113
115
  end
114
116
 
115
117
  it 'should return github_pull_request' do
116
- allow(highline_cli).to receive(:ask).and_return('Github')
118
+ allow(highline_wrapper).to receive(:ask).and_return('Github')
117
119
  expect(subject).to receive(:github_pull_request)
118
120
  subject.send(:ask_for_clarification)
119
121
  end
@@ -121,13 +123,13 @@ describe GitHelper::CodeRequest do
121
123
 
122
124
  context 'when response is gitlab' do
123
125
  it 'should return gitlab_merge_request' do
124
- allow(highline_cli).to receive(:ask).and_return('gitlab')
126
+ allow(highline_wrapper).to receive(:ask).and_return('gitlab')
125
127
  expect(subject).to receive(:gitlab_merge_request)
126
128
  subject.send(:ask_for_clarification)
127
129
  end
128
130
 
129
131
  it 'should return gitlab_merge_request' do
130
- allow(highline_cli).to receive(:ask).and_return('Gitlab')
132
+ allow(highline_wrapper).to receive(:ask).and_return('Gitlab')
131
133
  expect(subject).to receive(:gitlab_merge_request)
132
134
  subject.send(:ask_for_clarification)
133
135
  end
@@ -136,7 +138,7 @@ describe GitHelper::CodeRequest do
136
138
  # Unfortunately this test sometimes fails... just rerun the tests if it does
137
139
  context 'when response is neither' do
138
140
  it 'should raise an error' do
139
- allow(highline_cli).to receive(:ask).and_return(Faker::Lorem.word)
141
+ allow(highline_wrapper).to receive(:ask).and_return(Faker::Lorem.word)
140
142
  expect(subject).to receive(:exit)
141
143
  subject.send(:ask_for_clarification)
142
144
  end
@@ -174,23 +176,23 @@ describe GitHelper::CodeRequest do
174
176
  describe '#base_branch' do
175
177
  it 'should call the default branch' do
176
178
  expect(subject).to receive(:default_branch)
177
- allow(highline_cli).to receive(:ask_yes_no).at_least(:once)
178
- allow(highline_cli).to receive(:ask).at_least(:once).and_return(base_branch)
179
+ allow(highline_wrapper).to receive(:ask_yes_no).at_least(:once)
180
+ allow(highline_wrapper).to receive(:ask).at_least(:once).and_return(base_branch)
179
181
  subject.send(:base_branch)
180
182
  end
181
183
 
182
184
  it 'should ask the CLI to ask the user' do
183
185
  allow(subject).to receive(:default_branch)
184
- expect(highline_cli).to receive(:ask_yes_no).at_least(:once)
185
- allow(highline_cli).to receive(:ask).at_least(:once).and_return(base_branch)
186
+ expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once)
187
+ allow(highline_wrapper).to receive(:ask).at_least(:once).and_return(base_branch)
186
188
  subject.send(:base_branch)
187
189
  end
188
190
 
189
191
  context 'if the user says no' do
190
192
  it 'definitely asks for the users base branch' do
191
193
  allow(subject).to receive(:default_branch)
192
- expect(highline_cli).to receive(:ask_yes_no).at_least(:once).and_return(false)
193
- expect(highline_cli).to receive(:ask).at_least(:once).and_return(base_branch)
194
+ expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once).and_return(false)
195
+ expect(highline_wrapper).to receive(:ask).at_least(:once).and_return(base_branch)
194
196
  subject.send(:base_branch)
195
197
  end
196
198
  end
@@ -198,8 +200,8 @@ describe GitHelper::CodeRequest do
198
200
  context 'if the user says yes' do
199
201
  it 'does not ask for the users base branch' do
200
202
  allow(subject).to receive(:default_branch)
201
- expect(highline_cli).to receive(:ask_yes_no).at_least(:once).and_return(true)
202
- expect(highline_cli).not_to receive(:base_branch)
203
+ expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once).and_return(true)
204
+ expect(highline_wrapper).not_to receive(:base_branch)
203
205
  subject.send(:base_branch)
204
206
  end
205
207
  end
@@ -216,23 +218,23 @@ describe GitHelper::CodeRequest do
216
218
  describe '#new_code_request_title' do
217
219
  it 'should call autogenerated title method' do
218
220
  expect(subject).to receive(:autogenerated_title)
219
- allow(highline_cli).to receive(:ask_yes_no).at_least(:once)
220
- allow(highline_cli).to receive(:ask).at_least(:once).and_return(title)
221
+ allow(highline_wrapper).to receive(:ask_yes_no).at_least(:once)
222
+ allow(highline_wrapper).to receive(:ask).at_least(:once).and_return(title)
221
223
  subject.send(:new_code_request_title)
222
224
  end
223
225
 
224
226
  it 'should ask the CLI to ask the user' do
225
227
  allow(subject).to receive(:autogenerated_title).and_return(Faker::Lorem.sentence)
226
- expect(highline_cli).to receive(:ask_yes_no).at_least(:once)
227
- allow(highline_cli).to receive(:ask).at_least(:once).and_return(title)
228
+ expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once)
229
+ allow(highline_wrapper).to receive(:ask).at_least(:once).and_return(title)
228
230
  subject.send(:new_code_request_title)
229
231
  end
230
232
 
231
233
  context 'if the user says no' do
232
234
  it 'definitely asks for the users title' do
233
235
  allow(subject).to receive(:autogenerated_title).and_return(Faker::Lorem.sentence)
234
- expect(highline_cli).to receive(:ask_yes_no).at_least(:once).and_return(false)
235
- expect(highline_cli).to receive(:ask).at_least(:once).and_return(title)
236
+ expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once).and_return(false)
237
+ expect(highline_wrapper).to receive(:ask).at_least(:once).and_return(title)
236
238
  subject.send(:new_code_request_title)
237
239
  end
238
240
  end
@@ -240,8 +242,8 @@ describe GitHelper::CodeRequest do
240
242
  context 'if the user says yes to original title' do
241
243
  it 'does not ask for the users chosen title' do
242
244
  allow(subject).to receive(:autogenerated_title).and_return(Faker::Lorem.sentence)
243
- expect(highline_cli).to receive(:ask_yes_no).at_least(:once).and_return(true)
244
- expect(highline_cli).not_to receive(:ask)
245
+ expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once).and_return(true)
246
+ expect(highline_wrapper).not_to receive(:ask)
245
247
  subject.send(:new_code_request_title)
246
248
  end
247
249
  end
@@ -254,10 +256,10 @@ describe GitHelper::CodeRequest do
254
256
  end
255
257
  end
256
258
 
257
- describe '#cli' do
258
- it 'should call the octokit client' do
259
- expect(GitHelper::HighlineCli).to receive(:new).and_return(highline_cli)
260
- subject.send(:cli)
259
+ describe '#highline' do
260
+ it 'should create a highline_wrapper client' do
261
+ expect(HighlineWrapper).to receive(:new).and_return(highline_wrapper)
262
+ subject.send(:highline)
261
263
  end
262
264
  end
263
265
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'git_helper'
3
5
 
@@ -7,14 +9,14 @@ describe GitHelper::GitConfigReader do
7
9
  let(:gitlab_user) { Faker::Internet.username }
8
10
  let(:gitlab_token) { Faker::Internet.password(max_length: 10) }
9
11
 
10
- let(:config_file) {
12
+ let(:config_file) do
11
13
  {
12
14
  github_user: github_user,
13
15
  github_token: github_token,
14
16
  gitlab_user: gitlab_user,
15
17
  gitlab_token: gitlab_token
16
18
  }
17
- }
19
+ end
18
20
 
19
21
  subject { GitHelper::GitConfigReader.new }
20
22