codenamev_bitbucket_api 0.4.0
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 +7 -0
- data/LICENSE.txt +43 -0
- data/README.md +169 -0
- data/Rakefile +3 -0
- data/lib/bitbucket_rest_api/api/actions.rb +50 -0
- data/lib/bitbucket_rest_api/api/arguments.rb +248 -0
- data/lib/bitbucket_rest_api/api/config/property.rb +30 -0
- data/lib/bitbucket_rest_api/api/config/property_set.rb +118 -0
- data/lib/bitbucket_rest_api/api/config.rb +107 -0
- data/lib/bitbucket_rest_api/api/factory.rb +29 -0
- data/lib/bitbucket_rest_api/api.rb +242 -0
- data/lib/bitbucket_rest_api/authorization.rb +34 -0
- data/lib/bitbucket_rest_api/client/invitations.rb +16 -0
- data/lib/bitbucket_rest_api/client/issues/comments.rb +109 -0
- data/lib/bitbucket_rest_api/client/issues/components.rb +103 -0
- data/lib/bitbucket_rest_api/client/issues/milestones.rb +103 -0
- data/lib/bitbucket_rest_api/client/issues.rb +214 -0
- data/lib/bitbucket_rest_api/client/repos/changesets.rb +55 -0
- data/lib/bitbucket_rest_api/client/repos/following.rb +40 -0
- data/lib/bitbucket_rest_api/client/repos/keys.rb +88 -0
- data/lib/bitbucket_rest_api/client/repos/pull_requests/comments.rb +42 -0
- data/lib/bitbucket_rest_api/client/repos/pull_requests/commits.rb +24 -0
- data/lib/bitbucket_rest_api/client/repos/pull_requests.rb +199 -0
- data/lib/bitbucket_rest_api/client/repos/services.rb +104 -0
- data/lib/bitbucket_rest_api/client/repos/sources.rb +32 -0
- data/lib/bitbucket_rest_api/client/repos.rb +224 -0
- data/lib/bitbucket_rest_api/client/user.rb +96 -0
- data/lib/bitbucket_rest_api/client/users/account.rb +54 -0
- data/lib/bitbucket_rest_api/client/users.rb +14 -0
- data/lib/bitbucket_rest_api/client.rb +54 -0
- data/lib/bitbucket_rest_api/compatibility.rb +23 -0
- data/lib/bitbucket_rest_api/configuration.rb +59 -0
- data/lib/bitbucket_rest_api/connection.rb +61 -0
- data/lib/bitbucket_rest_api/constants.rb +50 -0
- data/lib/bitbucket_rest_api/core_ext/array.rb +17 -0
- data/lib/bitbucket_rest_api/core_ext/hash.rb +56 -0
- data/lib/bitbucket_rest_api/core_ext/ordered_hash.rb +107 -0
- data/lib/bitbucket_rest_api/deprecation.rb +39 -0
- data/lib/bitbucket_rest_api/error/bad_request.rb +12 -0
- data/lib/bitbucket_rest_api/error/client_error.rb +20 -0
- data/lib/bitbucket_rest_api/error/forbidden.rb +12 -0
- data/lib/bitbucket_rest_api/error/internal_server_error.rb +12 -0
- data/lib/bitbucket_rest_api/error/invalid_options.rb +18 -0
- data/lib/bitbucket_rest_api/error/not_found.rb +12 -0
- data/lib/bitbucket_rest_api/error/required_params.rb +18 -0
- data/lib/bitbucket_rest_api/error/service_error.rb +19 -0
- data/lib/bitbucket_rest_api/error/service_unavailable.rb +12 -0
- data/lib/bitbucket_rest_api/error/unauthorized.rb +12 -0
- data/lib/bitbucket_rest_api/error/unknown_value.rb +18 -0
- data/lib/bitbucket_rest_api/error/unprocessable_entity.rb +12 -0
- data/lib/bitbucket_rest_api/error/validations.rb +18 -0
- data/lib/bitbucket_rest_api/error.rb +35 -0
- data/lib/bitbucket_rest_api/ext/faraday.rb +38 -0
- data/lib/bitbucket_rest_api/middleware.rb +31 -0
- data/lib/bitbucket_rest_api/normalizer.rb +27 -0
- data/lib/bitbucket_rest_api/null_encoder.rb +25 -0
- data/lib/bitbucket_rest_api/page_iterator.rb +90 -0
- data/lib/bitbucket_rest_api/page_links.rb +33 -0
- data/lib/bitbucket_rest_api/paged_request.rb +29 -0
- data/lib/bitbucket_rest_api/pagination.rb +97 -0
- data/lib/bitbucket_rest_api/parameter_filter.rb +32 -0
- data/lib/bitbucket_rest_api/params_hash.rb +100 -0
- data/lib/bitbucket_rest_api/request/basic_auth.rb +33 -0
- data/lib/bitbucket_rest_api/request/jsonize.rb +51 -0
- data/lib/bitbucket_rest_api/request/oauth.rb +51 -0
- data/lib/bitbucket_rest_api/request/verbs.rb +53 -0
- data/lib/bitbucket_rest_api/request.rb +91 -0
- data/lib/bitbucket_rest_api/response/header.rb +68 -0
- data/lib/bitbucket_rest_api/response/helpers.rb +21 -0
- data/lib/bitbucket_rest_api/response/jsonize.rb +30 -0
- data/lib/bitbucket_rest_api/response/mashify.rb +24 -0
- data/lib/bitbucket_rest_api/response/raise_error.rb +31 -0
- data/lib/bitbucket_rest_api/response/xmlize.rb +26 -0
- data/lib/bitbucket_rest_api/response.rb +28 -0
- data/lib/bitbucket_rest_api/response_wrapper.rb +157 -0
- data/lib/bitbucket_rest_api/result.rb +68 -0
- data/lib/bitbucket_rest_api/users.rb +20 -0
- data/lib/bitbucket_rest_api/utils/url.rb +56 -0
- data/lib/bitbucket_rest_api/validations/format.rb +24 -0
- data/lib/bitbucket_rest_api/validations/presence.rb +30 -0
- data/lib/bitbucket_rest_api/validations/required.rb +24 -0
- data/lib/bitbucket_rest_api/validations/token.rb +43 -0
- data/lib/bitbucket_rest_api/validations.rb +25 -0
- data/lib/bitbucket_rest_api/version.rb +11 -0
- data/lib/bitbucket_rest_api.rb +136 -0
- metadata +238 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'faraday'
|
|
4
|
+
|
|
5
|
+
module BitBucket
|
|
6
|
+
class Request
|
|
7
|
+
class OAuth < Faraday::Middleware
|
|
8
|
+
include BitBucket::Utils::Url
|
|
9
|
+
|
|
10
|
+
AUTH_HEADER = 'Authorization'.freeze
|
|
11
|
+
|
|
12
|
+
dependency 'simple_oauth'
|
|
13
|
+
|
|
14
|
+
def call(env)
|
|
15
|
+
# Extract parameters from the query
|
|
16
|
+
params = { }.update query_params(env[:url])
|
|
17
|
+
|
|
18
|
+
if (@token and @secret) and (!@token.empty? and !@secret.empty?)
|
|
19
|
+
access_token = ::OAuth::AccessToken.new(@consumer, @token, @secret)
|
|
20
|
+
env[:url].query = build_query params
|
|
21
|
+
|
|
22
|
+
puts oauth_helper.header
|
|
23
|
+
puts oauth_helper.header.class
|
|
24
|
+
env[:request_headers].merge!(AUTH_HEADER => oauth_helper.header)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
env[:url].query = build_query params
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@app.call env
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def initialize(app, *args)
|
|
35
|
+
super app
|
|
36
|
+
@app = app
|
|
37
|
+
@consumer = args.shift
|
|
38
|
+
@token = args.shift
|
|
39
|
+
@secret = args.shift
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def query_params(url)
|
|
43
|
+
if url.query.nil? or url.query.empty?
|
|
44
|
+
{}
|
|
45
|
+
else
|
|
46
|
+
parse_query url.query
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end # OAuth
|
|
50
|
+
end # Request
|
|
51
|
+
end # BitBucket
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module BitBucket
|
|
4
|
+
# A class responsible for dispatching http requests
|
|
5
|
+
class Request
|
|
6
|
+
|
|
7
|
+
# Defines HTTP verbs
|
|
8
|
+
module Verbs
|
|
9
|
+
# Make a get request
|
|
10
|
+
#
|
|
11
|
+
# @api public
|
|
12
|
+
def get_request(path, params = ParamsHash.empty)
|
|
13
|
+
request = Request.new(:get, path, self).call(current_options, params)
|
|
14
|
+
request.auto_paginate
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Make a patch request
|
|
18
|
+
#
|
|
19
|
+
# @api public
|
|
20
|
+
def patch_request(path, params = ParamsHash.empty)
|
|
21
|
+
Request.new(:patch, path, self).call(current_options, params)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Make a post request
|
|
25
|
+
#
|
|
26
|
+
# @api public
|
|
27
|
+
def post_request(path, params = ParamsHash.empty)
|
|
28
|
+
Request.new(:post, path, self).call(current_options, params)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Make a put request
|
|
32
|
+
#
|
|
33
|
+
# @api public
|
|
34
|
+
def put_request(path, params = ParamsHash.empty)
|
|
35
|
+
Request.new(:put, path, self).call(current_options, params)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Make a delete request
|
|
39
|
+
#
|
|
40
|
+
# @api public
|
|
41
|
+
def delete_request(path, params = ParamsHash.empty)
|
|
42
|
+
Request.new(:delete, path, self).call(current_options, params)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Make a options request
|
|
46
|
+
#
|
|
47
|
+
# @api public
|
|
48
|
+
def options_request(path, params = ParamsHash.empty)
|
|
49
|
+
Request.new(:options, path, self).call(current_options, params)
|
|
50
|
+
end
|
|
51
|
+
end # Verbs
|
|
52
|
+
end # Request
|
|
53
|
+
end # BitBucket
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'bitbucket_rest_api/request/oauth'
|
|
4
|
+
require 'bitbucket_rest_api/request/basic_auth'
|
|
5
|
+
require 'bitbucket_rest_api/request/jsonize'
|
|
6
|
+
|
|
7
|
+
require 'bitbucket_rest_api/connection'
|
|
8
|
+
|
|
9
|
+
module BitBucket
|
|
10
|
+
# Defines HTTP verbs
|
|
11
|
+
class Request
|
|
12
|
+
include Connection
|
|
13
|
+
|
|
14
|
+
HTTP_METHODS = [:get, :post, :put, :delete, :patch]
|
|
15
|
+
METHODS_WITH_BODIES = [ :post, :put, :patch ]
|
|
16
|
+
|
|
17
|
+
# Return http verb
|
|
18
|
+
#
|
|
19
|
+
# @return [Symbol]
|
|
20
|
+
attr_reader :action
|
|
21
|
+
|
|
22
|
+
# Return url
|
|
23
|
+
#
|
|
24
|
+
# @return [String]
|
|
25
|
+
attr_accessor :path
|
|
26
|
+
|
|
27
|
+
# Return api this request is associated with
|
|
28
|
+
#
|
|
29
|
+
# @return [BitBucket::API]
|
|
30
|
+
attr_reader :api
|
|
31
|
+
|
|
32
|
+
# Create a new Request
|
|
33
|
+
#
|
|
34
|
+
# @return [BitBucket::Request]
|
|
35
|
+
#
|
|
36
|
+
# @api public
|
|
37
|
+
def initialize(action, path, api)
|
|
38
|
+
@action = action
|
|
39
|
+
@path = path
|
|
40
|
+
@api = api
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Performs a request
|
|
44
|
+
#
|
|
45
|
+
# @param [Symbol] method - The Symbol the HTTP verb
|
|
46
|
+
# @param [String] path - String relative URL to access
|
|
47
|
+
# @param [Hash] params - Hash to configure the request API
|
|
48
|
+
#
|
|
49
|
+
# @return [BitBucket::ResponseWrapper]
|
|
50
|
+
#
|
|
51
|
+
# @api private
|
|
52
|
+
def call(current_options, params)
|
|
53
|
+
unless HTTP_METHODS.include?(action)
|
|
54
|
+
raise ArgumentError, "unknown http method: #{method}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
puts "EXECUTED: #{action} - #{path} with PARAMS: #{params}" if ENV['DEBUG']
|
|
58
|
+
|
|
59
|
+
request_options = params.options
|
|
60
|
+
connection_options = current_options.merge(request_options)
|
|
61
|
+
conn = connection(api, connection_options)
|
|
62
|
+
|
|
63
|
+
if conn.path_prefix != '/' && self.path.index(conn.path_prefix) != 0
|
|
64
|
+
self.path = (conn.path_prefix + self.path).gsub(/\/(\/)*/, '/')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
response = conn.send(action) do |request|
|
|
68
|
+
case action.to_sym
|
|
69
|
+
when *(HTTP_METHODS - METHODS_WITH_BODIES)
|
|
70
|
+
request.body = params.data if params.has_key?('data')
|
|
71
|
+
if params.has_key?('encoder')
|
|
72
|
+
request.params.params_encoder(params.encoder)
|
|
73
|
+
end
|
|
74
|
+
request.url(self.path, params.to_hash)
|
|
75
|
+
when *METHODS_WITH_BODIES
|
|
76
|
+
request.url(self.path, connection_options[:query] || {})
|
|
77
|
+
request.body = extract_data_from_params(params) unless params.empty?
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
ResponseWrapper.new(response, api)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
def extract_data_from_params(params) # :nodoc:
|
|
86
|
+
return params['data'] if params.has_key?('data') and !params['data'].nil?
|
|
87
|
+
return params
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end # Request
|
|
91
|
+
end # BitBucket
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module BitBucket
|
|
4
|
+
class Response
|
|
5
|
+
|
|
6
|
+
# Represents http response header
|
|
7
|
+
class Header < Struct.new(:env)
|
|
8
|
+
include BitBucket::Constants
|
|
9
|
+
|
|
10
|
+
SUCCESSFUL_STATUSES = 200..299
|
|
11
|
+
|
|
12
|
+
def loaded?
|
|
13
|
+
!!env
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Requests are limited to API v3 to 5000 per hour.
|
|
17
|
+
def ratelimit_limit
|
|
18
|
+
loaded? ? env[:response_headers][RATELIMIT_LIMIT] : nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def ratelimit_remaining
|
|
22
|
+
loaded? ? env[:response_headers][RATELIMIT_REMAINING] : nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def cache_control
|
|
26
|
+
loaded? ? env[:response_headers][CACHE_CONTROL] : nil
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def content_type
|
|
30
|
+
loaded? ? env[:response_headers][CONTENT_TYPE] : nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def content_length
|
|
34
|
+
loaded? ? env[:response_headers][CONTENT_LENGTH] : nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def etag
|
|
38
|
+
loaded? ? env[:response_headers][ETAG] : nil
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def date
|
|
42
|
+
loaded? ? env[:response_headers][DATE] : nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def location
|
|
46
|
+
loaded? ? env[:response_headers][LOCATION] : nil
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def server
|
|
50
|
+
loaded? ? env[:response_headers][SERVER] : nil
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def status
|
|
54
|
+
loaded? ? env[:status] : nil
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def success?
|
|
58
|
+
SUCCESSFUL_STATUSES.include? status
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Returns raw body
|
|
62
|
+
def body
|
|
63
|
+
loaded? ? env[:body] : nil
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end # Header
|
|
67
|
+
end # Response
|
|
68
|
+
end # BitBucket
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'faraday'
|
|
4
|
+
|
|
5
|
+
module BitBucket
|
|
6
|
+
class Response::Helpers < Response
|
|
7
|
+
|
|
8
|
+
def on_complete(env)
|
|
9
|
+
env[:body].class.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
|
|
10
|
+
include BitBucket::Result
|
|
11
|
+
|
|
12
|
+
def env
|
|
13
|
+
@env
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
RUBY_EVAL
|
|
17
|
+
env[:body].instance_eval { @env = env }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end # Response::Helpers
|
|
21
|
+
end # BitBucket
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'faraday'
|
|
4
|
+
|
|
5
|
+
module BitBucket
|
|
6
|
+
class Response::Jsonize < Response
|
|
7
|
+
dependency 'multi_json'
|
|
8
|
+
|
|
9
|
+
define_parser do |body|
|
|
10
|
+
if MultiJson.respond_to?(:load)
|
|
11
|
+
MultiJson.load body
|
|
12
|
+
else
|
|
13
|
+
MultiJson.decode body
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def parse(body)
|
|
18
|
+
case body
|
|
19
|
+
when ''
|
|
20
|
+
nil
|
|
21
|
+
when 'true'
|
|
22
|
+
true
|
|
23
|
+
when 'false'
|
|
24
|
+
false
|
|
25
|
+
else
|
|
26
|
+
self.class.parser.call body
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end # Response::Jsonize
|
|
30
|
+
end # BitBucket
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'faraday'
|
|
4
|
+
|
|
5
|
+
module BitBucket
|
|
6
|
+
class Response::Mashify < Response
|
|
7
|
+
dependency 'hashie/mash'
|
|
8
|
+
|
|
9
|
+
define_parser do |body|
|
|
10
|
+
::Hashie::Mash.new body
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def parse(body)
|
|
14
|
+
case body
|
|
15
|
+
when Hash
|
|
16
|
+
self.class.parser.call body
|
|
17
|
+
when Array
|
|
18
|
+
body.map { |item| item.is_a?(Hash) ? self.class.parser.call(item) : item }
|
|
19
|
+
else
|
|
20
|
+
body
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end # Response::Mashify
|
|
24
|
+
end # BitBucket
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'faraday'
|
|
4
|
+
require 'bitbucket_rest_api/error'
|
|
5
|
+
|
|
6
|
+
module BitBucket
|
|
7
|
+
class Response::RaiseError < Faraday::Response::Middleware
|
|
8
|
+
|
|
9
|
+
def on_complete(env)
|
|
10
|
+
case env[:status].to_i
|
|
11
|
+
when 400
|
|
12
|
+
raise BitBucket::Error::BadRequest.new(env)
|
|
13
|
+
when 401
|
|
14
|
+
raise BitBucket::Error::Unauthorized.new(env)
|
|
15
|
+
when 403
|
|
16
|
+
raise BitBucket::Error::Forbidden.new(env)
|
|
17
|
+
when 404
|
|
18
|
+
raise BitBucket::Error::NotFound.new(env)
|
|
19
|
+
when 422
|
|
20
|
+
raise BitBucket::Error::UnprocessableEntity.new(env)
|
|
21
|
+
when 500
|
|
22
|
+
raise BitBucket::Error::InternalServerError.new(env)
|
|
23
|
+
when 503
|
|
24
|
+
raise BitBucket::Error::ServiceUnavailable.new(env)
|
|
25
|
+
when 400...600
|
|
26
|
+
raise BitBucket::Error::ServiceError.new(env)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end # Response::RaiseError
|
|
31
|
+
end # BitBucket
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'faraday'
|
|
4
|
+
|
|
5
|
+
module BitBucket
|
|
6
|
+
class Response::Xmlize < Response
|
|
7
|
+
dependency 'nokogiri'
|
|
8
|
+
|
|
9
|
+
define_parser do |body|
|
|
10
|
+
::Nokogiri::XML body
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def parse(body)
|
|
14
|
+
case body
|
|
15
|
+
when ''
|
|
16
|
+
nil
|
|
17
|
+
when 'true'
|
|
18
|
+
true
|
|
19
|
+
when 'false'
|
|
20
|
+
false
|
|
21
|
+
else
|
|
22
|
+
self.class.parser.call body
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end # Response::Xmlize
|
|
26
|
+
end # BitBucket
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'faraday'
|
|
4
|
+
|
|
5
|
+
module BitBucket
|
|
6
|
+
# Contains methods and attributes that act on the response returned from the
|
|
7
|
+
# request
|
|
8
|
+
class Response < Faraday::Response::Middleware
|
|
9
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
|
10
|
+
|
|
11
|
+
class << self
|
|
12
|
+
attr_accessor :parser
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.define_parser(&block)
|
|
16
|
+
@parser = block
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def response_type(env)
|
|
20
|
+
env[:response_headers][CONTENT_TYPE].to_s
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def parse_response?(env)
|
|
24
|
+
env[:body].respond_to? :to_str
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end # Response
|
|
28
|
+
end # BitBucket
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module BitBucket
|
|
4
|
+
|
|
5
|
+
# A class responsible for proxing to faraday response
|
|
6
|
+
class ResponseWrapper
|
|
7
|
+
extend Forwardable
|
|
8
|
+
include Pagination
|
|
9
|
+
include Enumerable
|
|
10
|
+
|
|
11
|
+
attr_reader :response
|
|
12
|
+
|
|
13
|
+
attr_reader :current_api
|
|
14
|
+
|
|
15
|
+
attr_reader :env
|
|
16
|
+
|
|
17
|
+
def_delegators :body, :empty?, :size, :include?, :length, :to_a, :first, :flatten, :include?, :keys, :[]
|
|
18
|
+
|
|
19
|
+
def initialize(response, current_api)
|
|
20
|
+
@response = response
|
|
21
|
+
@current_api = current_api
|
|
22
|
+
@env = response.env
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Overwrite methods to hash keys
|
|
26
|
+
#
|
|
27
|
+
['id', 'type', 'fork'].each do |method_name|
|
|
28
|
+
define_method(method_name) do
|
|
29
|
+
self.body.fetch(method_name.to_s)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Request url
|
|
34
|
+
#
|
|
35
|
+
def url
|
|
36
|
+
response.env[:url].to_s
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def body=(value)
|
|
40
|
+
@body = value
|
|
41
|
+
@env[:body] = value
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Response raw body
|
|
45
|
+
#
|
|
46
|
+
def body
|
|
47
|
+
@body ? @body : response.body
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Response status
|
|
51
|
+
#
|
|
52
|
+
def status
|
|
53
|
+
response.status
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def success?
|
|
57
|
+
response.success?
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def redirect?
|
|
61
|
+
status.to_i >= 300 && status.to_i < 400
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def client_error?
|
|
65
|
+
status.to_i >= 400 && status.to_i < 500
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def server_error?
|
|
69
|
+
status.to_i >= 500 && status.to_i < 600
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Return response headers
|
|
73
|
+
#
|
|
74
|
+
def headers
|
|
75
|
+
BitBucket::Response::Header.new(env)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Lookup an attribute from the body if hash, otherwise behave like array index.
|
|
79
|
+
# Convert any key to string before calling.
|
|
80
|
+
#
|
|
81
|
+
def [](key)
|
|
82
|
+
if self.body.is_a?(Array)
|
|
83
|
+
self.body[key]
|
|
84
|
+
else
|
|
85
|
+
self.body.send(:"#{key}")
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Return response body as string
|
|
90
|
+
#
|
|
91
|
+
def to_s
|
|
92
|
+
body.to_s
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Convert the ResponseWrapper into a Hash
|
|
96
|
+
#
|
|
97
|
+
def to_hash
|
|
98
|
+
body.to_hash
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Convert the ResponseWrapper into an Array
|
|
102
|
+
#
|
|
103
|
+
def to_ary
|
|
104
|
+
body.to_ary
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Iterate over each resource inside the body
|
|
108
|
+
#
|
|
109
|
+
def each
|
|
110
|
+
body_parts = self.body.respond_to?(:each) ? self.body : [self.body]
|
|
111
|
+
return body_parts.to_enum unless block_given?
|
|
112
|
+
body_parts.each { |part| yield(part) }
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Check if body has an attribute
|
|
116
|
+
#
|
|
117
|
+
def has_key?(key)
|
|
118
|
+
self.body.is_a?(Hash) && self.body.has_key?(key)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Coerce any method calls for body attributes
|
|
122
|
+
#
|
|
123
|
+
def method_missing(method_name, *args, &block)
|
|
124
|
+
if self.has_key?(method_name.to_s)
|
|
125
|
+
self.[](method_name, &block)
|
|
126
|
+
else
|
|
127
|
+
super
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Check if method is defined on the body
|
|
132
|
+
#
|
|
133
|
+
def respond_to?(method_name)
|
|
134
|
+
if self.has_key?(method_name.to_s)
|
|
135
|
+
true
|
|
136
|
+
else
|
|
137
|
+
super
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Print only response body
|
|
142
|
+
#
|
|
143
|
+
def inspect
|
|
144
|
+
"#<#{self.class.name} @body=\"#{self.body}\">"
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Compare the wrapper with other wrapper for equality
|
|
148
|
+
#
|
|
149
|
+
def ==(other)
|
|
150
|
+
return false unless other.is_a?(self.class)
|
|
151
|
+
return false unless (other.respond_to?(:env) && other.respond_to?(:body))
|
|
152
|
+
self.env == other.env && self.body == other.body
|
|
153
|
+
end
|
|
154
|
+
alias eql? ==
|
|
155
|
+
|
|
156
|
+
end # ResponseWrapper
|
|
157
|
+
end # BitBucket
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module BitBucket
|
|
4
|
+
module Result
|
|
5
|
+
include BitBucket::Constants
|
|
6
|
+
include Pagination
|
|
7
|
+
|
|
8
|
+
# TODO Add result counts method to check total items looking at result links
|
|
9
|
+
|
|
10
|
+
def paginated?
|
|
11
|
+
loaded? ? !@env[:body][PARAM_PAGE].nil? : false
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def ratelimit_limit
|
|
15
|
+
loaded? ? @env[:response_headers][RATELIMIT_LIMIT] : nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def ratelimit_remaining
|
|
19
|
+
loaded? ? @env[:response_headers][RATELIMIT_REMAINING] : nil
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def cache_control
|
|
23
|
+
loaded? ? @env[:response_headers][CACHE_CONTROL] : nil
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def content_type
|
|
27
|
+
loaded? ? @env[:response_headers][CONTENT_TYPE] : nil
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def content_length
|
|
31
|
+
loaded? ? @env[:response_headers][CONTENT_LENGTH] : nil
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def etag
|
|
35
|
+
loaded? ? @env[:response_headers][ETAG] : nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def date
|
|
39
|
+
loaded? ? @env[:response_headers][DATE] : nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def location
|
|
43
|
+
loaded? ? @env[:response_headers][LOCATION] : nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def server
|
|
47
|
+
loaded? ? @env[:response_headers][SERVER] : nil
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def status
|
|
51
|
+
loaded? ? @env[:status] : nil
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def success?
|
|
55
|
+
(200..299).include? status
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns raw body
|
|
59
|
+
def body
|
|
60
|
+
loaded? ? @env[:body] : nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def loaded?
|
|
64
|
+
!!@env
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end # Result
|
|
68
|
+
end # BitBucket
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module BitBucket
|
|
4
|
+
class Client::Users < API
|
|
5
|
+
@version = '1.0'
|
|
6
|
+
|
|
7
|
+
require_all 'bitbucket_rest_api/users', 'account'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Creates new Users API
|
|
11
|
+
def initialize(options = { })
|
|
12
|
+
super(options)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Access to Users::Account API
|
|
16
|
+
namespace :account
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
end # Users
|
|
20
|
+
end # BitBucket
|