octokit 3.8.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,131 @@
1
+ require 'faraday'
2
+ require 'set'
3
+
4
+ # Adapted from lostisland/faraday_middleware. Trimmed down to just the logic
5
+ # that we need for octokit.rb.
6
+ #
7
+ # https://github.com/lostisland/faraday_middleware/blob/138766e/lib/faraday_middleware/response/follow_redirects.rb
8
+
9
+ module Octokit
10
+
11
+ module Middleware
12
+
13
+ # Public: Exception thrown when the maximum amount of requests is exceeded.
14
+ class RedirectLimitReached < Faraday::Error::ClientError
15
+ attr_reader :response
16
+
17
+ def initialize(response)
18
+ super "too many redirects; last one to: #{response['location']}"
19
+ @response = response
20
+ end
21
+ end
22
+
23
+ # Public: Follow HTTP 301, 302, 303, and 307 redirects.
24
+ #
25
+ # For HTTP 303, the original GET, POST, PUT, DELETE, or PATCH request gets
26
+ # converted into a GET. For HTTP 301, 302, and 307, the HTTP method remains
27
+ # unchanged.
28
+ #
29
+ # This middleware currently only works with synchronous requests; i.e. it
30
+ # doesn't support parallelism.
31
+ class FollowRedirects < Faraday::Middleware
32
+ # HTTP methods for which 30x redirects can be followed
33
+ ALLOWED_METHODS = Set.new [:head, :options, :get, :post, :put, :patch, :delete]
34
+
35
+ # HTTP redirect status codes that this middleware implements
36
+ REDIRECT_CODES = Set.new [301, 302, 303, 307]
37
+
38
+ # Keys in env hash which will get cleared between requests
39
+ ENV_TO_CLEAR = Set.new [:status, :response, :response_headers]
40
+
41
+ # Default value for max redirects followed
42
+ FOLLOW_LIMIT = 3
43
+
44
+ # Regex that matches characters that need to be escaped in URLs, sans
45
+ # the "%" character which we assume already represents an escaped
46
+ # sequence.
47
+ URI_UNSAFE = /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]%]/
48
+
49
+ # Public: Initialize the middleware.
50
+ #
51
+ # options - An options Hash (default: {}):
52
+ # :limit - A Fixnum redirect limit (default: 3).
53
+ def initialize(app, options = {})
54
+ super(app)
55
+ @options = options
56
+
57
+ @convert_to_get = Set.new [303]
58
+ end
59
+
60
+ def call(env)
61
+ perform_with_redirection(env, follow_limit)
62
+ end
63
+
64
+ private
65
+
66
+ def convert_to_get?(response)
67
+ ![:head, :options].include?(response.env[:method]) &&
68
+ @convert_to_get.include?(response.status)
69
+ end
70
+
71
+ def perform_with_redirection(env, follows)
72
+ request_body = env[:body]
73
+ response = @app.call(env)
74
+
75
+ response.on_complete do |response_env|
76
+ if follow_redirect?(response_env, response)
77
+ raise(RedirectLimitReached, response) if follows.zero?
78
+ new_request_env = update_env(response_env, request_body, response)
79
+ response = perform_with_redirection(new_request_env, follows - 1)
80
+ end
81
+ end
82
+ response
83
+ end
84
+
85
+ def update_env(env, request_body, response)
86
+ original_url = env[:url]
87
+ env[:url] += safe_escape(response["location"])
88
+ unless same_host?(original_url, env[:url])
89
+ env[:request_headers].delete("Authorization")
90
+ end
91
+
92
+ if convert_to_get?(response)
93
+ env[:method] = :get
94
+ env[:body] = nil
95
+ else
96
+ env[:body] = request_body
97
+ end
98
+
99
+ ENV_TO_CLEAR.each { |key| env.delete(key) }
100
+
101
+ env
102
+ end
103
+
104
+ def follow_redirect?(env, response)
105
+ ALLOWED_METHODS.include?(env[:method]) &&
106
+ REDIRECT_CODES.include?(response.status)
107
+ end
108
+
109
+ def follow_limit
110
+ @options.fetch(:limit, FOLLOW_LIMIT)
111
+ end
112
+
113
+ def same_host?(original_url, redirect_url)
114
+ original_uri = Addressable::URI.parse(original_url)
115
+ redirect_uri = Addressable::URI.parse(redirect_url)
116
+
117
+ redirect_uri.host.nil? || original_uri.host == redirect_uri.host
118
+ end
119
+
120
+ # Internal: Escapes unsafe characters from a URL which might be a path
121
+ # component only or a fully-qualified URI so that it can be joined onto a
122
+ # URI:HTTP using the `+` operator. Doesn't escape "%" characters so to not
123
+ # risk double-escaping.
124
+ def safe_escape(uri)
125
+ uri.to_s.gsub(URI_UNSAFE) { |match|
126
+ "%" + match.unpack("H2" * match.bytesize).join("%").upcase
127
+ }
128
+ end
129
+ end
130
+ end
131
+ end
@@ -27,6 +27,8 @@ module Octokit
27
27
  when Hash
28
28
  @name = repo[:repo] ||= repo[:name]
29
29
  @owner = repo[:owner] ||= repo[:user] ||= repo[:username]
30
+ else
31
+ raise ArgumentError, "Invalid Repository. Use user/repo format."
30
32
  end
31
33
  end
32
34
 
@@ -1,11 +1,11 @@
1
1
  module Octokit
2
2
  # Current major release.
3
3
  # @return [Integer]
4
- MAJOR = 3
4
+ MAJOR = 4
5
5
 
6
6
  # Current minor release.
7
7
  # @return [Integer]
8
- MINOR = 8
8
+ MINOR = 0
9
9
 
10
10
  # Current patch level.
11
11
  # @return [Integer]
@@ -0,0 +1,17 @@
1
+ module Octokit
2
+
3
+ # Allows warnings to be suppressed via environment variable.
4
+ module Warnable
5
+
6
+ # Wrapper around Kernel#warn to print warnings unless
7
+ # OCTOKIT_SILENT is set to true.
8
+ #
9
+ # @return [nil]
10
+ def octokit_warn(*message)
11
+ unless ENV['OCTOKIT_SILENT']
12
+ warn message
13
+ end
14
+ end
15
+ end
16
+ end
17
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octokit
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.8.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wynn Netherland
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-02-19 00:00:00.000000000 Z
13
+ date: 2015-06-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -63,7 +63,6 @@ files:
63
63
  - lib/octokit.rb
64
64
  - lib/octokit/arguments.rb
65
65
  - lib/octokit/authentication.rb
66
- - lib/octokit/backports/uri.rb
67
66
  - lib/octokit/client.rb
68
67
  - lib/octokit/client/authorizations.rb
69
68
  - lib/octokit/client/commit_comments.rb
@@ -80,6 +79,7 @@ files:
80
79
  - lib/octokit/client/issues.rb
81
80
  - lib/octokit/client/labels.rb
82
81
  - lib/octokit/client/legacy_search.rb
82
+ - lib/octokit/client/licenses.rb
83
83
  - lib/octokit/client/markdown.rb
84
84
  - lib/octokit/client/meta.rb
85
85
  - lib/octokit/client/milestones.rb
@@ -100,9 +100,18 @@ files:
100
100
  - lib/octokit/client/statuses.rb
101
101
  - lib/octokit/client/users.rb
102
102
  - lib/octokit/configurable.rb
103
+ - lib/octokit/connection.rb
103
104
  - lib/octokit/default.rb
105
+ - lib/octokit/enterprise_admin_client.rb
106
+ - lib/octokit/enterprise_admin_client/admin_stats.rb
107
+ - lib/octokit/enterprise_admin_client/license.rb
108
+ - lib/octokit/enterprise_admin_client/search_indexing.rb
109
+ - lib/octokit/enterprise_admin_client/users.rb
110
+ - lib/octokit/enterprise_management_console_client.rb
111
+ - lib/octokit/enterprise_management_console_client/management_console.rb
104
112
  - lib/octokit/error.rb
105
113
  - lib/octokit/gist.rb
114
+ - lib/octokit/middleware/follow_redirects.rb
106
115
  - lib/octokit/organization.rb
107
116
  - lib/octokit/rate_limit.rb
108
117
  - lib/octokit/repo_arguments.rb
@@ -111,6 +120,7 @@ files:
111
120
  - lib/octokit/response/raise_error.rb
112
121
  - lib/octokit/user.rb
113
122
  - lib/octokit/version.rb
123
+ - lib/octokit/warnable.rb
114
124
  - octokit.gemspec
115
125
  homepage: https://github.com/octokit/octokit.rb
116
126
  licenses:
@@ -132,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
142
  version: 1.3.5
133
143
  requirements: []
134
144
  rubyforge_project:
135
- rubygems_version: 2.2.2
145
+ rubygems_version: 2.2.3
136
146
  signing_key:
137
147
  specification_version: 4
138
148
  summary: Ruby toolkit for working with the GitHub API
@@ -1,56 +0,0 @@
1
- # :stopdoc:
2
-
3
- # Stolen from ruby core's uri/common.rb, with modifications to support 1.8.x
4
- #
5
- # https://github.com/ruby/ruby/blob/trunk/lib/uri/common.rb
6
- #
7
- #
8
-
9
- module URI
10
- TBLENCWWWCOMP_ = {} # :nodoc:
11
- 256.times do |i|
12
- TBLENCWWWCOMP_[i.chr] = '%%%02X' % i
13
- end
14
- TBLENCWWWCOMP_[' '] = '+'
15
- TBLENCWWWCOMP_.freeze
16
- TBLDECWWWCOMP_ = {} # :nodoc:
17
- 256.times do |i|
18
- h, l = i>>4, i&15
19
- TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
20
- TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
21
- TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
22
- TBLDECWWWCOMP_['%%%x%x' % [h, l]] = i.chr
23
- end
24
- TBLDECWWWCOMP_['+'] = ' '
25
- TBLDECWWWCOMP_.freeze
26
-
27
- # Encode given +s+ to URL-encoded form data.
28
- #
29
- # This method doesn't convert *, -, ., 0-9, A-Z, _, a-z, but does convert SP
30
- # (ASCII space) to + and converts others to %XX.
31
- #
32
- # This is an implementation of
33
- # http://www.w3.org/TR/html5/forms.html#url-encoded-form-data
34
- #
35
- # See URI.decode_www_form_component, URI.encode_www_form
36
- def self.encode_www_form_component(s)
37
- str = s.to_s
38
- if RUBY_VERSION < "1.9" && $KCODE =~ /u/i
39
- str.gsub(/([^ a-zA-Z0-9_.-]+)/) do
40
- '%' + $1.unpack('H2' * Rack::Utils.bytesize($1)).join('%').upcase
41
- end.tr(' ', '+')
42
- else
43
- str.gsub(/[^*\-.0-9A-Z_a-z]/) {|m| TBLENCWWWCOMP_[m]}
44
- end
45
- end
46
-
47
- # Decode given +str+ of URL-encoded form data.
48
- #
49
- # This decodes + to SP.
50
- #
51
- # See URI.encode_www_form_component, URI.decode_www_form
52
- def self.decode_www_form_component(str, enc=nil)
53
- raise ArgumentError, "invalid %-encoding (#{str})" unless /\A(?:%[0-9a-fA-F]{2}|[^%])*\z/ =~ str
54
- str.gsub(/\+|%[0-9a-fA-F]{2}/) {|m| TBLDECWWWCOMP_[m]}
55
- end
56
- end