thegarage-gitx 2.2.0 → 2.2.1

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
  SHA1:
3
- metadata.gz: 152c875f8eb8b86aad9094c529e6e547137a2212
4
- data.tar.gz: 9f3db5ede9c825be43ca41b136ae2df7ed9dd29c
3
+ metadata.gz: ba83717e3ca477e8d78381ab9dd58802d78944b1
4
+ data.tar.gz: dab659256d11dcfc92ea739e89dfa89a19659779
5
5
  SHA512:
6
- metadata.gz: 30e2e170892d5d28f703defed75a891bc0ce2c66b76901e8f2e443727c18eabf4cd567f131a5812a95150c8f02c226e4f099caf6f651a6a5d8cc3609c64f111d
7
- data.tar.gz: 47c016b57019b11d853a5c7f6695cac46bf72025d9ca4fdee0553c7f605a327f829d0d813704d762d7a57d7b0961f7c0b79d9602a8bc20e529a098700f7930ec
6
+ metadata.gz: 1ec1f688077ea72a712997fb19238ec93ebfb0f1f69ed2690dbcee08a5105e7c3a52d0febb1b63fb4055272670dfe98644a252e2dcd75754b4adb77ea1f3ea98
7
+ data.tar.gz: 0be38d52627ff9b5f29146dfdbba90c30065a0bff09cb4034dd39414f2147f72c6127f86e20f17596623f3a12b915dd4a2d1ee9ecb3247d658716656d54bca38
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
1
  --color
2
- --format progress
2
+ --warnings
3
+ --require spec_helper
@@ -4,6 +4,7 @@ require 'thegarage/gitx/cli/base_command'
4
4
  require 'thegarage/gitx/cli/update_command'
5
5
  require 'json'
6
6
  require 'rest_client'
7
+ require 'octokit'
7
8
 
8
9
  module Thegarage
9
10
  module Gitx
@@ -56,31 +57,22 @@ module Thegarage
56
57
 
57
58
  fail "Github user not configured. Run: `git config --global github.user 'me@email.com'`" unless username
58
59
  password = ask("Github password for #{username}: ", :echo => false)
60
+ say ''
61
+ two_factor_auth_token = ask("Github two factor authorization token (if enabled): ", :echo => false)
59
62
 
60
- client_name = "The Garage Git eXtensions - #{remote_origin_name}"
61
- payload = {
63
+ timestamp = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%S%z')
64
+ client_name = "The Garage Git eXtensions - #{remote_origin_name} #{timestamp}"
65
+ options = {
62
66
  :scopes => ['repo'],
63
67
  :note => client_name,
64
68
  :note_url => CLIENT_URL
65
- }.to_json
66
- response = RestClient::Request.new({
67
- :url => "https://api.github.com/authorizations",
68
- :method => "POST",
69
- :user => username,
70
- :password => password,
71
- :payload => payload,
72
- :headers => {
73
- :accept => :json,
74
- :content_type => :json,
75
- :user_agent => 'thegarage/gitx'
76
- }
77
- }).execute
78
- data = JSON.parse response.body
79
- token = data['token']
69
+ }
70
+ options[:headers] = {'X-GitHub-OTP' => two_factor_auth_token} if two_factor_auth_token
71
+ client = Octokit::Client.new(login: username, password: password)
72
+ response = client.create_authorization(options)
73
+ token = response.token
80
74
  repo.config['thegarage.gitx.githubauthtoken'] = token
81
75
  token
82
- rescue RestClient::Exception => e
83
- process_error e
84
76
  end
85
77
 
86
78
  # @see http://developer.github.com/v3/pulls/
@@ -1,5 +1,5 @@
1
1
  module Thegarage
2
2
  module Gitx
3
- VERSION = '2.2.0'
3
+ VERSION = '2.2.1'
4
4
  end
5
5
  end
data/spec/spec_helper.rb CHANGED
@@ -2,22 +2,82 @@ require 'coveralls'
2
2
  Coveralls.wear!
3
3
  require 'rubygems'
4
4
  require 'bundler/setup'
5
- require 'pry'
6
- require 'webmock/rspec'
7
- require 'timecop'
8
5
 
9
6
  # Requires supporting ruby files with custom matchers and macros, etc,
10
7
  # in spec/support/ and its subdirectories.
11
8
  Dir[File.join(__dir__, "support/**/*.rb")].each { |f| require f }
12
9
 
10
+ # This file was generated by the `rspec --init` command. Conventionally, all
11
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
12
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
13
+ # file to always be loaded, without a need to explicitly require it in any files.
14
+ #
15
+ # Given that it is always loaded, you are encouraged to keep this file as
16
+ # light-weight as possible. Requiring heavyweight dependencies from this file
17
+ # will add to the boot time of your test suite on EVERY test run, even for an
18
+ # individual file that may not need all of that loaded. Instead, make a
19
+ # separate helper file that requires this one and then use it only in the specs
20
+ # that actually need it.
21
+ #
22
+ # The `.rspec` file also contains a few flags that are not defaults but that
23
+ # users commonly want.
24
+ #
25
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
13
26
  RSpec.configure do |config|
14
- config.treat_symbols_as_metadata_keys_with_true_values = true
15
- config.run_all_when_everything_filtered = true
27
+ # These two settings work together to allow you to limit a spec run
28
+ # to individual examples or groups you care about by tagging them with
29
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
30
+ # get run.
16
31
  config.filter_run :focus
32
+ config.run_all_when_everything_filtered = true
33
+
34
+ # Many RSpec users commonly either run the entire suite or an individual
35
+ # file, and it's useful to allow more verbose output when running an
36
+ # individual spec file.
37
+ if config.files_to_run.one?
38
+ # Use the documentation formatter for detailed output,
39
+ # unless a formatter has already been configured
40
+ # (e.g. via a command-line flag).
41
+ config.default_formatter = 'doc'
42
+ end
43
+
44
+ # Print the 10 slowest examples and example groups at the
45
+ # end of the spec run, to help surface which specs are running
46
+ # particularly slow.
47
+ config.profile_examples = 10
17
48
 
18
49
  # Run specs in random order to surface order dependencies. If you find an
19
50
  # order dependency and want to debug it, you can fix the order by providing
20
51
  # the seed, which is printed after each run.
21
52
  # --seed 1234
22
- config.order = 'random'
53
+ config.order = :random
54
+
55
+ # Seed global randomization in this process using the `--seed` CLI option.
56
+ # Setting this allows you to use `--seed` to deterministically reproduce
57
+ # test failures related to randomization by passing the same `--seed` value
58
+ # as the one that triggered the failure.
59
+ Kernel.srand config.seed
60
+
61
+ # rspec-expectations config goes here. You can use an alternate
62
+ # assertion/expectation library such as wrong or the stdlib/minitest
63
+ # assertions if you prefer.
64
+ config.expect_with :rspec do |expectations|
65
+ # Enable only the newer, non-monkey-patching expect syntax.
66
+ # For more details, see:
67
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
68
+ expectations.syntax = :expect
69
+ end
70
+
71
+ # rspec-mocks config goes here. You can use an alternate test double
72
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
73
+ config.mock_with :rspec do |mocks|
74
+ # Enable only the newer, non-monkey-patching expect syntax.
75
+ # For more details, see:
76
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
77
+ mocks.syntax = :expect
78
+
79
+ # Prevents you from mocking or stubbing a method that does not exist on
80
+ # a real object. This is generally recommended.
81
+ mocks.verify_partial_doubles = true
82
+ end
23
83
  end
@@ -2,6 +2,6 @@
2
2
  RSpec::Matchers.define :meet_expectations do |expected|
3
3
  match do |actual|
4
4
  # do nothing
5
- expect(true).to be_true
5
+ expect(true).to be true
6
6
  end
7
7
  end
@@ -0,0 +1 @@
1
+ require 'pry'
@@ -0,0 +1,9 @@
1
+ require 'timecop'
2
+
3
+ # use safe mode to prevent unexpected time leaking errors
4
+ # see https://github.com/travisjeffery/timecop#timecopsafe_mode
5
+ RSpec.configure do |config|
6
+ config.before do
7
+ Timecop.safe_mode = true
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ require 'webmock/rspec'
@@ -27,6 +27,7 @@ describe Thegarage::Gitx::Cli::ReviewCommand do
27
27
  let(:pull_request) do
28
28
  {
29
29
  'html_url' => 'https://path/to/new/pull/request',
30
+ 'issue_url' => 'https://api/path/to/new/pull/request',
30
31
  'head' => {
31
32
  'ref' => 'branch_name'
32
33
  }
@@ -80,14 +81,17 @@ describe Thegarage::Gitx::Cli::ReviewCommand do
80
81
  end
81
82
  let(:authorization_token) { '123123' }
82
83
  before do
83
- expect(cli).to receive(:authorization_token).and_return(authorization_token)
84
+ expect(cli).to receive(:authorization_token).and_return(authorization_token).at_least(:once)
84
85
  expect(cli).to receive(:find_pull_request).and_return(pull_request)
85
- expect(cli).to receive(:assign_pull_request)
86
+
87
+ stub_request(:patch, 'https://api/path/to/new/pull/request').to_return(:status => 200)
86
88
 
87
89
  cli.review
88
90
  end
89
- it 'calls assign_pull_request method' do
90
- should meet_expectations
91
+ it 'updates github pull request' do
92
+ expect(WebMock).to have_requested(:patch, "https://api/path/to/new/pull/request").
93
+ with(:body => {title: 'branch_name', assignee: 'johndoe'}.to_json,
94
+ :headers => {'Accept'=>'application/json', 'Authorization'=>'token 123123', 'Content-Type'=>'application/json'})
91
95
  end
92
96
  end
93
97
  context 'when --open flag passed' do
@@ -126,19 +130,12 @@ describe Thegarage::Gitx::Cli::ReviewCommand do
126
130
  end
127
131
  let(:github_password) { 'secretz' }
128
132
  let(:authorization_token) { '123981239123' }
129
- let(:expected_auth_body) do
130
- JSON.dump({
131
- scopes: ["repo"],
132
- note: "The Garage Git eXtensions - thegarage/thegarage-gitx",
133
- note_url: "https://github.com/thegarage/thegarage-gitx"
134
- })
135
- end
136
133
  before do
137
134
  stub_request(:post, "https://ryan@codecrate.com:secretz@api.github.com/authorizations").
138
- with(:body => expected_auth_body).
139
- to_return(:status => 200, :body => JSON.dump(token: authorization_token), :headers => {})
135
+ to_return(:status => 200, :body => JSON.dump(token: authorization_token), :headers => {'Content-Type' => 'application/json'})
140
136
 
141
137
  expect(cli).to receive(:ask).with('Github password for ryan@codecrate.com: ', {:echo => false}).and_return(github_password)
138
+ expect(cli).to receive(:ask).with('Github two factor authorization token (if enabled): ', {:echo => false}).and_return(nil)
142
139
 
143
140
  @auth_token = cli.send(:authorization_token)
144
141
  end
@@ -161,6 +158,31 @@ describe Thegarage::Gitx::Cli::ReviewCommand do
161
158
  end
162
159
  it { expect(@auth_token).to eq authorization_token }
163
160
  end
161
+ context 'when two factor authorization token given' do
162
+ let(:repo_config) do
163
+ {
164
+ 'remote.origin.url' => 'https://github.com/thegarage/thegarage-gitx',
165
+ 'github.user' => 'ryan@codecrate.com'
166
+ }
167
+ end
168
+ let(:github_password) { 'secretz' }
169
+ let(:authorization_token) { '123981239123' }
170
+ let(:two_factor_auth_token) { '456456' }
171
+ before do
172
+ stub_request(:post, "https://ryan@codecrate.com:secretz@api.github.com/authorizations").
173
+ with(headers: {'X-GitHub-OTP' => two_factor_auth_token}).
174
+ to_return(:status => 200, :body => JSON.dump(token: authorization_token), :headers => {'Content-Type' => 'application/json'})
175
+
176
+ expect(cli).to receive(:ask).with('Github password for ryan@codecrate.com: ', {:echo => false}).and_return(github_password)
177
+ expect(cli).to receive(:ask).with('Github two factor authorization token (if enabled): ', {:echo => false}).and_return(two_factor_auth_token)
178
+
179
+ @auth_token = cli.send(:authorization_token)
180
+ end
181
+ it 'stores authorization_token in git config' do
182
+ expect(repo_config).to include('thegarage.gitx.githubauthtoken' => authorization_token)
183
+ end
184
+ it { expect(@auth_token).to eq authorization_token }
185
+ end
164
186
  end
165
187
  describe '#create_pull_request' do
166
188
  context 'when there is an existing authorization_token' do
@@ -19,15 +19,16 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_runtime_dependency "rugged", '~> 0.19.0'
22
- spec.add_runtime_dependency "rest-client", ">= 1.4.0"
23
22
  spec.add_runtime_dependency "thor"
23
+ spec.add_runtime_dependency "rest-client", ">= 1.4.0"
24
+ spec.add_runtime_dependency "octokit"
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.3"
26
27
  spec.add_development_dependency "rake"
27
- spec.add_development_dependency "rspec", '>= 2.11.0'
28
+ spec.add_development_dependency "rspec", '~> 3.0'
28
29
  spec.add_development_dependency "pry", '>= 0'
29
30
  spec.add_development_dependency "webmock", '>= 0'
30
- spec.add_development_dependency "timecop", "~> 0.6.3"
31
+ spec.add_development_dependency "timecop", "~> 0.7.0"
31
32
  spec.add_development_dependency "guard"
32
33
  spec.add_development_dependency "guard-rspec"
33
34
  spec.add_development_dependency "coveralls"
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.2.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Sonnek
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.19.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rest-client
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +53,7 @@ dependencies:
39
53
  - !ruby/object:Gem::Version
40
54
  version: 1.4.0
41
55
  - !ruby/object:Gem::Dependency
42
- name: thor
56
+ name: octokit
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - '>='
@@ -84,16 +98,16 @@ dependencies:
84
98
  name: rspec
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - '>='
101
+ - - ~>
88
102
  - !ruby/object:Gem::Version
89
- version: 2.11.0
103
+ version: '3.0'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - '>='
108
+ - - ~>
95
109
  - !ruby/object:Gem::Version
96
- version: 2.11.0
110
+ version: '3.0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: pry
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +142,14 @@ dependencies:
128
142
  requirements:
129
143
  - - ~>
130
144
  - !ruby/object:Gem::Version
131
- version: 0.6.3
145
+ version: 0.7.0
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - ~>
137
151
  - !ruby/object:Gem::Version
138
- version: 0.6.3
152
+ version: 0.7.0
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: guard
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -235,7 +249,10 @@ files:
235
249
  - lib/thegarage/gitx/string_extensions.rb
236
250
  - lib/thegarage/gitx/version.rb
237
251
  - spec/spec_helper.rb
238
- - spec/support/meet_expectations_matcher.rb
252
+ - spec/support/matchers/meet_expectations_matcher.rb
253
+ - spec/support/pry.rb
254
+ - spec/support/timecop.rb
255
+ - spec/support/webmock.rb
239
256
  - spec/thegarage/gitx/cli/buildtag_command_spec.rb
240
257
  - spec/thegarage/gitx/cli/cleanup_command_spec.rb
241
258
  - spec/thegarage/gitx/cli/integrate_command_spec.rb
@@ -273,7 +290,10 @@ specification_version: 4
273
290
  summary: Utility scripts for Git to increase productivity for common operations
274
291
  test_files:
275
292
  - spec/spec_helper.rb
276
- - spec/support/meet_expectations_matcher.rb
293
+ - spec/support/matchers/meet_expectations_matcher.rb
294
+ - spec/support/pry.rb
295
+ - spec/support/timecop.rb
296
+ - spec/support/webmock.rb
277
297
  - spec/thegarage/gitx/cli/buildtag_command_spec.rb
278
298
  - spec/thegarage/gitx/cli/cleanup_command_spec.rb
279
299
  - spec/thegarage/gitx/cli/integrate_command_spec.rb