github_api 0.12.2 → 0.12.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2d26348e58869906a79e2dfc0c48dfa954108eac
4
+ data.tar.gz: 825111954c6cd0c7d9a54fd3b266f095abdddec3
5
+ SHA512:
6
+ metadata.gz: 108dfe9e60966232c63e19b23dff3fdd9b2309ef8118bc28fe115625f8593bdbaf1838fa288a0a88846069d8249894775a3a0e1230424c40de5966606a26d451
7
+ data.tar.gz: f82977eb6dfd356e52b946435eca533b6896668181cb1a804f69c6db8546bebd03cebd9bce2a25a25f757071950823a9f19fe5763a48d49a8458e2ff52407100
data/README.md CHANGED
@@ -67,9 +67,10 @@ gem "github_api"
67
67
  * [2.4 Caching](#24-caching)
68
68
  * [3. Authentication](#3-authentication)
69
69
  * [3.1 Basic](#31-basic)
70
- * [3.2 Application OAuth](#32-application-oauth)
71
- * [3.3 Authorizations API](#33-authorizations-api)
72
- * [3.4 Scopes](#34-scopes)
70
+ * [3.2 Authorizations API](#32-authorizations-api)
71
+ * [3.3 Scopes](#33-scopes)
72
+ * [3.4 Application OAuth](#34-application-oauth)
73
+ * [3.5 Two-Factor](#35-two-factor)
73
74
  * [4. Pagination](#4-pagination)
74
75
  * [4.1 Auto pagination](#41-auto-pagination)
75
76
  * [5. Error Handling](#5-error-handling)
@@ -251,12 +252,10 @@ For example, to set `etag` and `X-Poll_Interval` headers, use the `:headers` has
251
252
 
252
253
  ```ruby
253
254
  events = Github::Client::Activity::Events.new
254
- events.public options: {
255
- headers: {
255
+ events.public headers: {
256
256
  'X-Poll-Interval': 60,
257
257
  'ETag': "a18c3bded88eb5dbb5c849a489412bf3"
258
258
  }
259
- }
260
259
  ```
261
260
 
262
261
  #### 1.5.1 Media Types
@@ -401,35 +400,9 @@ Github.new basic_auth: 'login:password'
401
400
 
402
401
  Though this method is convenient you should strongly consider using `OAuth` for improved security reasons.
403
402
 
404
- ### 3.2 Application OAuth
405
-
406
- In order to authenticate your app through OAuth2 on GitHub you need to
407
-
408
- * Visit https://github.com/settings/applications/new and register your app.
409
- You will need to be logged in to initially register the application.
410
-
411
- * Authorize your credentials https://github.com/login/oauth/authorize
412
-
413
- You can use convenience methods to help you achieve this using **GithubAPI** gem:
403
+ ### 3.2 Authorizations API
414
404
 
415
- ```ruby
416
- github = Github.new client_id: '...', client_secret: '...'
417
- github.authorize_url redirect_uri: 'http://localhost', scope: 'repo'
418
- # => "https://github.com/login/oauth/authorize?scope=repo&response_type=code&client_id='...'&redirect_uri=http%3A%2F%2Flocalhost"
419
- ```
420
- After you get your authorization code, call to receive your access_token
421
-
422
- ```ruby
423
- token = github.get_token( authorization_code )
424
- ```
425
-
426
- Once you have your access token, configure your github instance following instructions under Configuration.
427
-
428
- **Note**: If you are working locally (i.e. your app URL and callback URL are localhost), do not specify a ```:redirect_uri``` otherwise you will get a ```redirect_uri_mismatch``` error.
429
-
430
- ### 3.3 Authorizations API
431
-
432
- #### 3.3.1 For an User
405
+ #### 3.2.1 For an User
433
406
 
434
407
  To create an access token through the GitHub Authrizations API, you are required to pass your basic credentials and scopes you wish to have for the authentication token.
435
408
 
@@ -440,7 +413,7 @@ github.oauth.create scopes: ['repo']
440
413
 
441
414
  You can add more than one scope from the `user`, `public_repo`, `repo`, `gist` or leave the scopes parameter out, in which case, the default read-only access will be assumed (includes public user profile info, public repo info, and gists).
442
415
 
443
- #### 3.3.2 For an App
416
+ #### 3.2.2 For an App
444
417
 
445
418
  Furthermore, to create auth token for an application you need to pass `:app` argument together with `:client_id` and `:client_secret` parameters.
446
419
 
@@ -462,12 +435,12 @@ Revoke a specific app token.
462
435
  github.oauth.app.delete 'client-id', 'access-token'
463
436
  ```
464
437
 
465
- ### 3.4 Scopes
438
+ ### 3.3 Scopes
466
439
 
467
440
  You can check OAuth scopes you have by:
468
441
 
469
442
  ```ruby
470
- github = Github.new :oauth_token => 'token'
443
+ github = Github.new oauth_token: 'token'
471
444
  github.scopes.list # => ['repo']
472
445
  ```
473
446
 
@@ -481,6 +454,52 @@ response.headers.accepted_oauth_scopes # => ['delete_repo', 'repo', 'public_rep
481
454
 
482
455
  To understand what each scope means refer to [documentation](http://developer.github.com/v3/oauth/#scopes)
483
456
 
457
+ ### 3.4 Application OAuth
458
+
459
+ In order to authenticate your app through OAuth2 on GitHub you need to
460
+
461
+ * Visit https://github.com/settings/applications/new and register your app.
462
+ You will need to be logged in to initially register the application.
463
+
464
+ * Authorize your credentials https://github.com/login/oauth/authorize
465
+
466
+ You can use convenience methods to help you achieve this using **GithubAPI** gem:
467
+
468
+ ```ruby
469
+ github = Github.new client_id: '...', client_secret: '...'
470
+ github.authorize_url redirect_uri: 'http://localhost', scope: 'repo'
471
+ # => "https://github.com/login/oauth/authorize?scope=repo&response_type=code&client_id='...'&redirect_uri=http%3A%2F%2Flocalhost"
472
+ ```
473
+ After you get your authorization code, call to receive your access_token
474
+
475
+ ```ruby
476
+ token = github.get_token( authorization_code )
477
+ ```
478
+
479
+ Once you have your access token, configure your github instance following instructions under Configuration.
480
+
481
+ **Note**: If you are working locally (i.e. your app URL and callback URL are localhost), do not specify a ```:redirect_uri``` otherwise you will get a ```redirect_uri_mismatch``` error.
482
+
483
+ ### 3.5 Two-Factor
484
+
485
+ In order to use [Two-Factor](https://help.github.com/articles/about-two-factor-authentication) authentication you need provide `X-GitHub-OTP: required; :2fa-type` header.
486
+
487
+ You can add headers during initialization:
488
+
489
+ ```ruby
490
+ Github.new do |config|
491
+ config.basic_auth = "user:password"
492
+ config.connection_options = {headers: {"X-GitHub-OTP" => '2fa token'}}
493
+ end
494
+ ```
495
+
496
+ or per request:
497
+
498
+ ```ruby
499
+ github = Github.new basic_auth: 'login:password'
500
+ github.oauth.create scopes: ["public_repo"],
501
+ headers: {"X-GitHub-OTP" => "2fa token"}
502
+ ```
484
503
 
485
504
  ## 4 Pagination
486
505
 
@@ -284,7 +284,7 @@ module Github
284
284
  # @option params [String] :homepage
285
285
  # Optional string
286
286
  # @option params [Boolean] :private
287
- # Optional boolean, false to create public repos, false to create a private one
287
+ # Optional boolean, true to make this a private repository, false to make it a public one
288
288
  # @option params [Boolean] :has_issues
289
289
  # Optional boolean - true to enable issues for this repository,
290
290
  # false to disable them
@@ -26,7 +26,12 @@ module Github
26
26
  },
27
27
  ssl: options[:ssl],
28
28
  url: options[:endpoint]
29
- }
29
+ }.tap do |h|
30
+ if type = options[:headers] && options[:headers][CONTENT_TYPE]
31
+ h[:headers][CONTENT_TYPE] = type
32
+ end
33
+ h
34
+ end
30
35
  end
31
36
 
32
37
  def clear_cache
@@ -56,6 +61,7 @@ module Github
56
61
  clear_cache unless options.empty?
57
62
  builder = api.stack ? api.stack : stack(options.merge!(api: api))
58
63
  connection_options.merge!(builder: builder)
64
+ connection_options.deep_merge!(options[:connection_options]) if options[:connection_options]
59
65
  if ENV['DEBUG']
60
66
  p "Connection options : \n"
61
67
  pp connection_options
@@ -7,6 +7,8 @@ module Github
7
7
 
8
8
  RATELIMIT_LIMIT = 'X-RateLimit-Limit'.freeze
9
9
 
10
+ RATELIMIT_RESET = 'X-RateLimit-Reset'.freeze
11
+
10
12
  CONTENT_TYPE = 'Content-Type'.freeze
11
13
 
12
14
  CONTENT_LENGTH = 'content-length'.freeze
@@ -4,18 +4,20 @@ require 'delegate'
4
4
  require 'base64'
5
5
 
6
6
  module Github
7
-
8
7
  # Class responsible for holding request parameters
9
8
  class ParamsHash < DelegateClass(Hash)
10
9
  include Normalizer
11
10
  include MimeType
12
11
 
12
+ REQUEST_PARAMS = [:accept, :media, :data, :raw, :content_type, :headers]
13
+
13
14
  def initialize(hash)
14
15
  super(normalize!(Hash[hash]))
15
16
  end
16
17
 
17
18
  # Create empty hash
18
19
  #
20
+ # @api public
19
21
  def self.empty
20
22
  new({})
21
23
  end
@@ -24,52 +26,55 @@ module Github
24
26
  #
25
27
  # [.version].param[+json]
26
28
  #
29
+ # @api public
27
30
  def media
28
31
  parse(delete('media'))
29
32
  end
30
33
 
31
- # Return accept header if present
34
+ # Get accept header
32
35
  #
36
+ # @api public
33
37
  def accept
34
- if has_key?('accept')
35
- delete('accept')
36
- elsif has_key?('media')
37
- media
38
- else
39
- nil
38
+ if key?('accept') then self['accept']
39
+ elsif key?('media') then media
40
+ else nil
40
41
  end
41
42
  end
42
43
 
43
44
  # Extract request data from parameters
44
45
  #
46
+ # @api public
45
47
  def data
46
- if has_key?('data') && !self['data'].nil?
47
- return delete('data')
48
+ if key?('data') && !self['data'].nil?
49
+ self['data']
48
50
  else
49
- return to_hash
51
+ request_params
50
52
  end
51
53
  end
52
54
 
53
55
  def encoder
54
- if has_key?('encoder') && self['encoder']
55
- return delete('encoder')
56
+ if key?('encoder') && self['encoder']
57
+ self['encoder']
56
58
  else
57
- return {}
59
+ {}
58
60
  end
59
61
  end
60
62
 
61
- # Any client configuration options
63
+ # Configuration options from request
62
64
  #
65
+ # @return [Hash]
66
+ #
67
+ # @api public
63
68
  def options
64
- opts = has_key?('options') ? delete('options') : {}
65
- headers = opts.fetch(:headers) { {} }
69
+ opts = fetch('options', {})
70
+ headers = fetch('headers', {})
66
71
  if value = accept
67
72
  headers[:accept] = value
68
73
  end
69
- if value = delete('content_type')
70
- headers[:content_type] = value
74
+ if self['content_type']
75
+ headers[:content_type] = self['content_type']
71
76
  end
72
- opts[:raw] = has_key?('raw') ? delete('raw') : false
77
+ opts[:raw] = key?('raw') ? self['raw'] : false
73
78
  opts[:headers] = headers unless headers.empty?
74
79
  opts
75
80
  end
@@ -79,7 +84,7 @@ module Github
79
84
  def merge_default(defaults)
80
85
  if defaults && !defaults.empty?
81
86
  defaults.each do |key, value|
82
- self[key] = value unless self.has_key?(key)
87
+ self[key] = value unless self.key?(key)
83
88
  end
84
89
  end
85
90
  self
@@ -87,15 +92,24 @@ module Github
87
92
 
88
93
  # Base64 encode string removing newline characters
89
94
  #
95
+ # @api public
90
96
  def strict_encode64(key)
91
97
  value = self[key]
92
98
  encoded = if Base64.respond_to?(:strict_encode64)
93
- Base64.strict_encode64(value)
94
- else
95
- [value].pack("m0")
96
- end
99
+ Base64.strict_encode64(value)
100
+ else
101
+ [value].pack('m0')
102
+ end
97
103
  self[key] = encoded.delete("\n\r")
98
104
  end
99
105
 
106
+ # Filter out request params
107
+ #
108
+ # @api public
109
+ def request_params
110
+ to_hash.select do |key, value|
111
+ !REQUEST_PARAMS.include?(key.to_sym)
112
+ end
113
+ end
100
114
  end # ParamsHash
101
115
  end # Github
@@ -68,11 +68,11 @@ module Github
68
68
  response = conn.send(action) do |request|
69
69
  case action.to_sym
70
70
  when *(HTTP_METHODS - METHODS_WITH_BODIES)
71
- request.body = params.data if params.has_key?('data')
72
- if params.has_key?('encoder')
71
+ request.body = params.data if params.key?('data')
72
+ if params.key?('encoder')
73
73
  request.params.params_encoder(params.encoder)
74
74
  end
75
- request.url(self.path, params.to_hash)
75
+ request.url(self.path, params.request_params)
76
76
  when *METHODS_WITH_BODIES
77
77
  request.url(self.path, connection_options[:query] || {})
78
78
  request.body = params.data unless params.empty?
@@ -14,9 +14,9 @@ module Github
14
14
  if request_with_body?(env)
15
15
  env[:request_headers][CONTENT_TYPE] ||= MIME_TYPE
16
16
  env[:body] = encode_body env[:body] unless env[:body].respond_to?(:to_str)
17
- else
17
+ elsif safe_to_modify?(env)
18
18
  # Ensure valid body for put and post requests
19
- if [:put, :patch, :post].include? env[:method]
19
+ if [:put, :patch, :post].include?(env[:method])
20
20
  env[:body] = encode_body({})
21
21
  end
22
22
  end
@@ -33,7 +33,12 @@ module Github
33
33
 
34
34
  def request_with_body?(env)
35
35
  type = request_type(env)
36
- has_body?(env) and (type.empty? or type == MIME_TYPE)
36
+ has_body?(env) and safe_to_modify?(env)
37
+ end
38
+
39
+ def safe_to_modify?(env)
40
+ type = request_type(env)
41
+ type.empty? or type == MIME_TYPE
37
42
  end
38
43
 
39
44
  # Don't encode bodies in string form
@@ -30,6 +30,12 @@ module Github
30
30
  loaded? ? env[:response_headers][RATELIMIT_REMAINING] : nil
31
31
  end
32
32
 
33
+ # A unix timestamp describing when the ratelimit will
34
+ # be reset
35
+ def ratelimit_reset
36
+ loaded? ? env[:response_headers][RATELIMIT_RESET] : nil
37
+ end
38
+
33
39
  def cache_control
34
40
  loaded? ? env[:response_headers][CACHE_CONTROL] : nil
35
41
  end
@@ -4,7 +4,7 @@ module Github
4
4
  module VERSION
5
5
  MAJOR = 0
6
6
  MINOR = 12
7
- PATCH = 2
7
+ PATCH = 3
8
8
  BUILD = nil
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.');
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Github::Client::Authorizations, 'two-factor' do
6
+ let(:basic_auth) { 'login:password' }
7
+ let(:host) { "https://#{basic_auth}@api.github.com" }
8
+
9
+ it "fails with known OTP error" do
10
+ stub_get("/authorizations/1", host).to_return(
11
+ status: 401,
12
+ headers: {
13
+ content_type: 'application/json',
14
+ 'X-GitHub-OTP' => 'required; sms'
15
+ },
16
+ body: {message: "Require two-factor authentication OTP token."}
17
+ )
18
+ expect {
19
+ described_class.new(basic_auth: 'login:password').get(1)
20
+ }.to raise_error(Github::Error::Unauthorized, /Require two-factor/)
21
+ end
22
+ end
@@ -2,34 +2,43 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe Github::ParamsHash do
5
+ RSpec.describe Github::ParamsHash do
6
6
  let(:object) { described_class }
7
7
 
8
- subject { object.new(hash) }
8
+ subject(:params) { object.new(hash) }
9
9
 
10
- context 'converts key to string' do
11
- let(:hash) { {:foo => 123 }}
10
+ context 'when empty' do
11
+ let(:hash) { {} }
12
+
13
+ it { expect(params.options).to eq({:raw => false}) }
14
+
15
+ it { expect(params.data).to eq({}) }
12
16
 
13
- it { expect(subject).to be_a(Github::ParamsHash)}
17
+ it { expect(params.accept).to eq(nil) }
18
+ end
19
+
20
+ context 'converts key to string' do
21
+ let(:hash) { {foo: 123 } }
14
22
 
15
- it { expect(subject['foo']).to eql(123) }
23
+ it { expect(params['foo']).to eql(123) }
16
24
 
17
- it { expect(subject.data).to eql({"foo" => 123}) }
25
+ it { expect(params.data).to eql({"foo" => 123}) }
18
26
  end
19
27
 
20
28
  context 'media' do
21
- let(:hash) { {:media => "raw"} }
29
+ let(:hash) { {media: "raw"} }
22
30
 
23
31
  it 'parses media key' do
24
- expect(subject.media).to eql('application/vnd.github.v3.raw+json')
32
+ expect(params.media).to eql('application/vnd.github.v3.raw+json')
25
33
  end
26
34
  end
27
35
 
28
36
  context 'with accept' do
29
- let(:hash) { {:accept => "application/json"} }
37
+ let(:hash) { {accept: "application/json"} }
30
38
 
31
39
  it 'overwrites media key' do
32
- expect(subject.accept).to eql('application/json')
40
+ expect(params.accept).to eql('application/json')
41
+ expect(params.to_hash).to eq({'accept' => 'application/json'})
33
42
  end
34
43
  end
35
44
 
@@ -37,39 +46,52 @@ describe Github::ParamsHash do
37
46
  let(:hash) { {} }
38
47
 
39
48
  it 'overwrites media key' do
40
- expect(subject.accept).to be_nil
49
+ expect(params.accept).to be_nil
41
50
  end
42
51
  end
43
52
 
44
- context 'extract data' do
45
- let(:hash) { {:data => 'foobar'} }
53
+ context 'when data' do
54
+ let(:hash) { {data: 'foobar'} }
46
55
 
47
- it { expect(subject.data).to eql('foobar') }
56
+ it 'extracts data key' do
57
+ expect(params.data).to eql('foobar')
58
+ expect(params.to_hash).to eql({'data' => 'foobar'})
59
+ end
60
+ end
61
+
62
+ context 'when content_type' do
63
+ let(:hash) { {content_type: 'application/octet-stream'} }
64
+
65
+ it 'extracts content_type key' do
66
+ expect(params.options[:headers]).to eql(hash)
67
+ end
48
68
  end
49
69
 
50
- context 'extracts options headers' do
51
- let(:hash) { {:content_type => 'application/octet-stream'} }
70
+ context 'when header' do
71
+ let(:hash) { {headers: {"X-GitHub-OTP" => "<2FA token>"}} }
52
72
 
53
- it { expect(subject.options[:headers]).to eql(hash) }
73
+ it "sets headers" do
74
+ expect(params.options[:headers]).to eql({"X-GitHub-OTP" => "<2FA token>" })
75
+ end
54
76
  end
55
77
 
56
78
  context 'merges defaults' do
57
79
  let(:hash) { { :homepage => "https://tty.github.io" }}
58
80
  let(:defaults) {
59
- { "homepage" => "https://github.com",
60
- "private" => false}
81
+ { "homepage" => "https://github.com",
82
+ "private" => false}
61
83
  }
62
84
 
63
85
  it 'correctly updates values' do
64
86
  subject.merge_default(defaults)
65
- expect(subject['homepage']).to eql("https://tty.github.io")
66
- expect(subject['private']).to be_false
87
+ expect(params['homepage']).to eql("https://tty.github.io")
88
+ expect(params['private']).to be_false
67
89
  end
68
90
  end
69
91
 
70
92
  context 'strict encode' do
71
- let(:hash) { { :content => "puts 'hello ruby'"} }
93
+ let(:hash) { {content: "puts 'hello ruby'"} }
72
94
 
73
- it { expect(subject.strict_encode64('content')).to eql('cHV0cyAnaGVsbG8gcnVieSc=') }
95
+ it { expect(params.strict_encode64('content')).to eql('cHV0cyAnaGVsbG8gcnVieSc=') }
74
96
  end
75
97
  end
@@ -8,6 +8,7 @@ describe Github::ResponseWrapper, '#headers' do
8
8
  'Content-Type' => "application/json; charset=utf-8",
9
9
  'X-RateLimit-Remaining' => '4999',
10
10
  'X-RateLimit-Limit' => '5000',
11
+ 'X-RateLimit-Reset' => '1422262420',
11
12
  'content-length' => '344',
12
13
  'ETag' => "\"d9a88f20567726e29d35c6fae87cef2f\"",
13
14
  'Server' => "nginx/1.0.4",
@@ -27,6 +28,8 @@ describe Github::ResponseWrapper, '#headers' do
27
28
 
28
29
  its(:ratelimit_remaining) { should == '4999' }
29
30
 
31
+ its(:ratelimit_reset) { should == '1422262420' }
32
+
30
33
  its(:status) { should be 200 }
31
34
 
32
35
  its(:etag) { should eql "\"d9a88f20567726e29d35c6fae87cef2f\"" }
metadata CHANGED
@@ -1,42 +1,46 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.2
5
- prerelease:
4
+ version: 0.12.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Piotr Murach
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-10-25 00:00:00.000000000Z
11
+ date: 2015-02-07 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: addressable
16
- requirement: &2152983460 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
19
  version: '2.3'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *2152983460
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '2.3'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: hashie
27
- requirement: &2152956600 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ! '>='
31
+ - - '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: '3.3'
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *2152956600
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '3.3'
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: faraday
38
- requirement: &2152951920 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ~>
42
46
  - !ruby/object:Gem::Version
@@ -46,13 +50,19 @@ dependencies:
46
50
  version: '0.10'
47
51
  type: :runtime
48
52
  prerelease: false
49
- version_requirements: *2152951920
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ version: '0.8'
58
+ - - <
59
+ - !ruby/object:Gem::Version
60
+ version: '0.10'
50
61
  - !ruby/object:Gem::Dependency
51
62
  name: multi_json
52
- requirement: &2152948760 !ruby/object:Gem::Requirement
53
- none: false
63
+ requirement: !ruby/object:Gem::Requirement
54
64
  requirements:
55
- - - ! '>='
65
+ - - '>='
56
66
  - !ruby/object:Gem::Version
57
67
  version: 1.7.5
58
68
  - - <
@@ -60,52 +70,71 @@ dependencies:
60
70
  version: '2.0'
61
71
  type: :runtime
62
72
  prerelease: false
63
- version_requirements: *2152948760
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 1.7.5
78
+ - - <
79
+ - !ruby/object:Gem::Version
80
+ version: '2.0'
64
81
  - !ruby/object:Gem::Dependency
65
82
  name: oauth2
66
- requirement: &2152947000 !ruby/object:Gem::Requirement
67
- none: false
83
+ requirement: !ruby/object:Gem::Requirement
68
84
  requirements:
69
- - - ! '>='
85
+ - - '>='
70
86
  - !ruby/object:Gem::Version
71
87
  version: '0'
72
88
  type: :runtime
73
89
  prerelease: false
74
- version_requirements: *2152947000
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
75
95
  - !ruby/object:Gem::Dependency
76
96
  name: nokogiri
77
- requirement: &2152945040 !ruby/object:Gem::Requirement
78
- none: false
97
+ requirement: !ruby/object:Gem::Requirement
79
98
  requirements:
80
99
  - - ~>
81
100
  - !ruby/object:Gem::Version
82
101
  version: 1.6.3
83
102
  type: :runtime
84
103
  prerelease: false
85
- version_requirements: *2152945040
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ~>
107
+ - !ruby/object:Gem::Version
108
+ version: 1.6.3
86
109
  - !ruby/object:Gem::Dependency
87
110
  name: descendants_tracker
88
- requirement: &2152942960 !ruby/object:Gem::Requirement
89
- none: false
111
+ requirement: !ruby/object:Gem::Requirement
90
112
  requirements:
91
113
  - - ~>
92
114
  - !ruby/object:Gem::Version
93
115
  version: 0.0.4
94
116
  type: :runtime
95
117
  prerelease: false
96
- version_requirements: *2152942960
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ~>
121
+ - !ruby/object:Gem::Version
122
+ version: 0.0.4
97
123
  - !ruby/object:Gem::Dependency
98
124
  name: bundler
99
- requirement: &2152934400 !ruby/object:Gem::Requirement
100
- none: false
125
+ requirement: !ruby/object:Gem::Requirement
101
126
  requirements:
102
127
  - - ~>
103
128
  - !ruby/object:Gem::Version
104
129
  version: '1.5'
105
130
  type: :development
106
131
  prerelease: false
107
- version_requirements: *2152934400
108
- description: ! ' Ruby client that supports all of the GitHub API methods. It''s build
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ~>
135
+ - !ruby/object:Gem::Version
136
+ version: '1.5'
137
+ description: ' Ruby client that supports all of the GitHub API methods. It''s build
109
138
  in a modular way, that is, you can either instantiate the whole api wrapper Github.new
110
139
  or use parts of it e.i. Github::Client::Repos.new if working solely with repositories
111
140
  is your main concern. Intuitive query methods allow you easily call API endpoints. '
@@ -650,6 +679,7 @@ files:
650
679
  - spec/github/client/authorizations/delete_spec.rb
651
680
  - spec/github/client/authorizations/get_spec.rb
652
681
  - spec/github/client/authorizations/list_spec.rb
682
+ - spec/github/client/authorizations/two_factor_spec.rb
653
683
  - spec/github/client/authorizations/update_spec.rb
654
684
  - spec/github/client/gists/comments/create_spec.rb
655
685
  - spec/github/client/gists/comments/delete_spec.rb
@@ -919,28 +949,28 @@ files:
919
949
  - README.md
920
950
  - LICENSE.txt
921
951
  homepage: http://peter-murach.github.io/github/
922
- licenses: []
952
+ licenses:
953
+ - MIT
954
+ metadata: {}
923
955
  post_install_message:
924
956
  rdoc_options: []
925
957
  require_paths:
926
958
  - lib
927
959
  required_ruby_version: !ruby/object:Gem::Requirement
928
- none: false
929
960
  requirements:
930
- - - ! '>='
961
+ - - '>='
931
962
  - !ruby/object:Gem::Version
932
963
  version: '0'
933
964
  required_rubygems_version: !ruby/object:Gem::Requirement
934
- none: false
935
965
  requirements:
936
- - - ! '>='
966
+ - - '>='
937
967
  - !ruby/object:Gem::Version
938
968
  version: '0'
939
969
  requirements: []
940
970
  rubyforge_project:
941
- rubygems_version: 1.8.10
971
+ rubygems_version: 2.0.3
942
972
  signing_key:
943
- specification_version: 3
973
+ specification_version: 4
944
974
  summary: Ruby client for the official GitHub API
945
975
  test_files: []
946
976
  has_rdoc: