thegarage-gitx 2.10.2 → 2.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/lib/thegarage/gitx/github.rb +51 -21
- data/lib/thegarage/gitx/version.rb +1 -1
- data/spec/support/global_config.rb +21 -0
- data/spec/support/home_env.rb +11 -0
- data/spec/thegarage/gitx/cli/review_command_spec.rb +18 -11
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d556d4767bbd711d406930510b698a1811e063c
|
4
|
+
data.tar.gz: 4b71eb5f631cf5b9d134ab842df9136321ca2601
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3baa98bde329c5ef4d7aa54610aa5393ef4899d7ed28e4558bad31df5d135f918983974947acea1f0a2f3db56d57506f2cf3696aaf7c44fae7095f9e9c90e0b0
|
7
|
+
data.tar.gz: 1d16107432222b84b7942a9be5af7be1875c15bd794432221667daaf0a8738155b740ab671cb13d9ea0488b9edcec0e35b5b069dd9fd757b6addbf412fec9348
|
data/.gitignore
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'octokit'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'yaml'
|
2
4
|
|
3
5
|
module Thegarage
|
4
6
|
module Gitx
|
5
7
|
module Github
|
8
|
+
GLOBAL_CONFIG_FILE = '~/.config/gitx/github.yml'
|
6
9
|
REVIEW_CONTEXT = 'peer_review'
|
7
10
|
CLIENT_URL = 'https://github.com/thegarage/thegarage-gitx'
|
8
11
|
PULL_REQUEST_FOOTER = <<-EOS.dedent
|
@@ -79,42 +82,41 @@ module Thegarage
|
|
79
82
|
body.gsub(PULL_REQUEST_FOOTER, '').chomp.strip
|
80
83
|
end
|
81
84
|
|
82
|
-
# token
|
85
|
+
# authorization token used for github API calls
|
86
|
+
# the token is cached on the filesystem for future use
|
83
87
|
# @return [String] auth token stored in git (current repo, user config or installed global settings)
|
84
88
|
# @see http://developer.github.com/v3/oauth/#scopes
|
85
89
|
# @see http://developer.github.com/v3/#user-agent-required
|
86
90
|
def authorization_token
|
87
|
-
auth_token =
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
91
|
+
auth_token = global_config['token']
|
92
|
+
auth_token ||= begin
|
93
|
+
new_token = create_authorization
|
94
|
+
save_global_config('token' => new_token)
|
95
|
+
new_token
|
96
|
+
end
|
92
97
|
auth_token
|
93
98
|
end
|
94
99
|
|
95
100
|
def create_authorization
|
96
|
-
password =
|
97
|
-
say ''
|
101
|
+
password = ask_without_echo("Github password for #{username}: ")
|
98
102
|
client = Octokit::Client.new(login: username, password: password)
|
99
|
-
|
103
|
+
options = {
|
104
|
+
:scopes => ['repo'],
|
105
|
+
:note => github_client_name,
|
106
|
+
:note_url => CLIENT_URL
|
107
|
+
}
|
108
|
+
two_factor_auth_token = ask_without_echo("Github two factor authorization token (if enabled): ")
|
109
|
+
options[:headers] = {'X-GitHub-OTP' => two_factor_auth_token} if two_factor_auth_token
|
110
|
+
response = client.create_authorization(options)
|
100
111
|
response.token
|
101
112
|
rescue Octokit::ClientError => e
|
102
113
|
say "Error creating authorization: #{e.message}", :red
|
103
114
|
retry
|
104
115
|
end
|
105
116
|
|
106
|
-
def
|
107
|
-
timestamp = Time.now.utc.strftime('%
|
108
|
-
client_name = "The Garage Git eXtensions
|
109
|
-
options = {
|
110
|
-
:scopes => ['repo'],
|
111
|
-
:note => client_name,
|
112
|
-
:note_url => CLIENT_URL
|
113
|
-
}
|
114
|
-
two_factor_auth_token = ask("Github two factor authorization token (if enabled): ", :echo => false)
|
115
|
-
say ''
|
116
|
-
options[:headers] = {'X-GitHub-OTP' => two_factor_auth_token} if two_factor_auth_token
|
117
|
-
options
|
117
|
+
def github_client_name
|
118
|
+
timestamp = Time.now.utc.strftime('%FT%R:%S%z')
|
119
|
+
client_name = "The Garage Git eXtensions #{timestamp}"
|
118
120
|
end
|
119
121
|
|
120
122
|
def github_client
|
@@ -142,6 +144,34 @@ module Thegarage
|
|
142
144
|
def github_organization
|
143
145
|
github_slug.split('/').first
|
144
146
|
end
|
147
|
+
|
148
|
+
def global_config_file
|
149
|
+
File.expand_path(GLOBAL_CONFIG_FILE)
|
150
|
+
end
|
151
|
+
|
152
|
+
def global_config
|
153
|
+
@config ||= begin
|
154
|
+
File.exists?(global_config_file) ? YAML.load_file(global_config_file) : {}
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def save_global_config(options)
|
159
|
+
config_dir = File.dirname(global_config_file)
|
160
|
+
::FileUtils.mkdir_p(config_dir, mode: 0700) unless File.exists?(config_dir)
|
161
|
+
|
162
|
+
@config = global_config.merge(options)
|
163
|
+
File.open(global_config_file, "a+") do |file|
|
164
|
+
file.truncate(0)
|
165
|
+
file.write(@config.to_yaml)
|
166
|
+
end
|
167
|
+
File.chmod(0600, global_config_file)
|
168
|
+
end
|
169
|
+
|
170
|
+
def ask_without_echo(message)
|
171
|
+
value = ask(message, echo: false)
|
172
|
+
say ''
|
173
|
+
value
|
174
|
+
end
|
145
175
|
end
|
146
176
|
end
|
147
177
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# helper for reading global config file
|
2
|
+
module GlobalConfig
|
3
|
+
def global_config_file
|
4
|
+
config_dir = File.join(__dir__, '../tmp/.config/gitx')
|
5
|
+
config_file = File.join(config_dir, 'github.yml')
|
6
|
+
FileUtils.mkdir_p(config_dir) unless File.exists?(config_dir)
|
7
|
+
config_file
|
8
|
+
end
|
9
|
+
def global_config
|
10
|
+
YAML.load_file(global_config_file)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.include GlobalConfig
|
16
|
+
|
17
|
+
config.before do
|
18
|
+
tmp_dir = File.join(__dir__, '../tmp')
|
19
|
+
FileUtils.rm_rf(tmp_dir)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Swap home directory to current project spec/tmp
|
2
|
+
# to allow for writing files + cleanup
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.before do
|
5
|
+
@old_home = ENV['HOME']
|
6
|
+
ENV['HOME'] = File.join(__dir__, '../tmp')
|
7
|
+
end
|
8
|
+
config.after do
|
9
|
+
ENV['HOME'] = @old_home
|
10
|
+
end
|
11
|
+
end
|
@@ -209,7 +209,7 @@ describe Thegarage::Gitx::Cli::ReviewCommand do
|
|
209
209
|
end.to raise_error(/Github user not configured/)
|
210
210
|
end
|
211
211
|
end
|
212
|
-
context 'when config
|
212
|
+
context 'when global config token is nil' do
|
213
213
|
let(:repo_config) do
|
214
214
|
{
|
215
215
|
'remote.origin.url' => 'https://github.com/thegarage/thegarage-gitx',
|
@@ -227,12 +227,12 @@ describe Thegarage::Gitx::Cli::ReviewCommand do
|
|
227
227
|
|
228
228
|
@auth_token = cli.send(:authorization_token)
|
229
229
|
end
|
230
|
-
it 'stores authorization_token in
|
231
|
-
expect(
|
230
|
+
it 'stores authorization_token in global config' do
|
231
|
+
expect(global_config).to include('token' => authorization_token)
|
232
232
|
end
|
233
233
|
it { expect(@auth_token).to eq authorization_token }
|
234
234
|
end
|
235
|
-
context 'when
|
235
|
+
context 'when global authorization_token is nil and first request fails' do
|
236
236
|
let(:repo_config) do
|
237
237
|
{
|
238
238
|
'remote.origin.url' => 'https://github.com/thegarage/thegarage-gitx',
|
@@ -252,21 +252,28 @@ describe Thegarage::Gitx::Cli::ReviewCommand do
|
|
252
252
|
|
253
253
|
@auth_token = cli.send(:authorization_token)
|
254
254
|
end
|
255
|
-
it 'stores authorization_token in
|
256
|
-
expect(
|
255
|
+
it 'stores authorization_token in global config' do
|
256
|
+
expect(global_config).to include('token' => authorization_token)
|
257
257
|
end
|
258
258
|
it { expect(@auth_token).to eq authorization_token }
|
259
259
|
end
|
260
|
-
context 'when
|
260
|
+
context 'when the global config has an existing token' do
|
261
261
|
let(:authorization_token) { '123981239123' }
|
262
262
|
let(:repo_config) do
|
263
263
|
{
|
264
264
|
'remote.origin.url' => 'https://github.com/thegarage/thegarage-gitx',
|
265
|
-
'github.user' => 'ryan@codecrate.com'
|
266
|
-
|
265
|
+
'github.user' => 'ryan@codecrate.com'
|
266
|
+
}
|
267
|
+
end
|
268
|
+
let(:config) do
|
269
|
+
{
|
270
|
+
'token' => authorization_token
|
267
271
|
}
|
268
272
|
end
|
269
273
|
before do
|
274
|
+
File.open(global_config_file, 'w') do |file|
|
275
|
+
file.write(config.to_yaml)
|
276
|
+
end
|
270
277
|
@auth_token = cli.send(:authorization_token)
|
271
278
|
end
|
272
279
|
it { expect(@auth_token).to eq authorization_token }
|
@@ -291,8 +298,8 @@ describe Thegarage::Gitx::Cli::ReviewCommand do
|
|
291
298
|
|
292
299
|
@auth_token = cli.send(:authorization_token)
|
293
300
|
end
|
294
|
-
it 'stores authorization_token in
|
295
|
-
expect(
|
301
|
+
it 'stores authorization_token in global config' do
|
302
|
+
expect(global_config).to include('token' => authorization_token)
|
296
303
|
end
|
297
304
|
it { expect(@auth_token).to eq authorization_token }
|
298
305
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thegarage-gitx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Sonnek
|
@@ -279,6 +279,8 @@ files:
|
|
279
279
|
- spec/fixtures/vcr_cassettes/pull_request_does_exist_with_success_status.yml
|
280
280
|
- spec/fixtures/vcr_cassettes/pull_request_does_not_exist.yml
|
281
281
|
- spec/spec_helper.rb
|
282
|
+
- spec/support/global_config.rb
|
283
|
+
- spec/support/home_env.rb
|
282
284
|
- spec/support/matchers/meet_expectations_matcher.rb
|
283
285
|
- spec/support/pry.rb
|
284
286
|
- spec/support/stub_execution.rb
|
@@ -325,6 +327,8 @@ test_files:
|
|
325
327
|
- spec/fixtures/vcr_cassettes/pull_request_does_exist_with_success_status.yml
|
326
328
|
- spec/fixtures/vcr_cassettes/pull_request_does_not_exist.yml
|
327
329
|
- spec/spec_helper.rb
|
330
|
+
- spec/support/global_config.rb
|
331
|
+
- spec/support/home_env.rb
|
328
332
|
- spec/support/matchers/meet_expectations_matcher.rb
|
329
333
|
- spec/support/pry.rb
|
330
334
|
- spec/support/stub_execution.rb
|