bitbucket_rest_api2 0.2.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 +7 -0
- data/README.md +169 -0
- data/lib/bitbucket_rest_api.rb +90 -0
- data/lib/bitbucket_rest_api/api.rb +106 -0
- data/lib/bitbucket_rest_api/api/actions.rb +35 -0
- data/lib/bitbucket_rest_api/api_factory.rb +30 -0
- data/lib/bitbucket_rest_api/authorization.rb +34 -0
- data/lib/bitbucket_rest_api/client.rb +56 -0
- data/lib/bitbucket_rest_api/configuration.rb +106 -0
- data/lib/bitbucket_rest_api/connection.rb +98 -0
- data/lib/bitbucket_rest_api/constants.rb +58 -0
- data/lib/bitbucket_rest_api/core_ext/array.rb +7 -0
- data/lib/bitbucket_rest_api/core_ext/hash.rb +46 -0
- data/lib/bitbucket_rest_api/deprecation.rb +39 -0
- data/lib/bitbucket_rest_api/error.rb +38 -0
- data/lib/bitbucket_rest_api/error/bad_events.rb +9 -0
- data/lib/bitbucket_rest_api/error/bad_request.rb +12 -0
- data/lib/bitbucket_rest_api/error/blank_value.rb +9 -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/no_events.rb +9 -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/invitations.rb +15 -0
- data/lib/bitbucket_rest_api/issues.rb +230 -0
- data/lib/bitbucket_rest_api/issues/comments.rb +118 -0
- data/lib/bitbucket_rest_api/issues/components.rb +106 -0
- data/lib/bitbucket_rest_api/issues/milestones.rb +107 -0
- data/lib/bitbucket_rest_api/normalizer.rb +27 -0
- data/lib/bitbucket_rest_api/parameter_filter.rb +32 -0
- data/lib/bitbucket_rest_api/repos.rb +264 -0
- data/lib/bitbucket_rest_api/repos/changesets.rb +54 -0
- data/lib/bitbucket_rest_api/repos/commits.rb +40 -0
- data/lib/bitbucket_rest_api/repos/default_reviewers.rb +59 -0
- data/lib/bitbucket_rest_api/repos/download.rb +21 -0
- data/lib/bitbucket_rest_api/repos/following.rb +39 -0
- data/lib/bitbucket_rest_api/repos/forks.rb +69 -0
- data/lib/bitbucket_rest_api/repos/keys.rb +87 -0
- data/lib/bitbucket_rest_api/repos/pull_request.rb +160 -0
- data/lib/bitbucket_rest_api/repos/services.rb +103 -0
- data/lib/bitbucket_rest_api/repos/sources.rb +39 -0
- data/lib/bitbucket_rest_api/repos/webhooks.rb +96 -0
- data/lib/bitbucket_rest_api/request.rb +76 -0
- data/lib/bitbucket_rest_api/request/basic_auth.rb +31 -0
- data/lib/bitbucket_rest_api/request/jsonize.rb +46 -0
- data/lib/bitbucket_rest_api/request/oauth.rb +53 -0
- data/lib/bitbucket_rest_api/response.rb +28 -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/result.rb +140 -0
- data/lib/bitbucket_rest_api/user.rb +101 -0
- data/lib/bitbucket_rest_api/users.rb +24 -0
- data/lib/bitbucket_rest_api/users/account.rb +53 -0
- data/lib/bitbucket_rest_api/utils/url.rb +56 -0
- data/lib/bitbucket_rest_api/validations.rb +25 -0
- data/lib/bitbucket_rest_api/validations/format.rb +24 -0
- data/lib/bitbucket_rest_api/validations/presence.rb +25 -0
- data/lib/bitbucket_rest_api/validations/required.rb +44 -0
- data/lib/bitbucket_rest_api/validations/token.rb +43 -0
- data/lib/bitbucket_rest_api/version.rb +11 -0
- data/spec/bitbucket_rest_api/api/actions_spec.rb +17 -0
- data/spec/bitbucket_rest_api/api_factory_spec.rb +30 -0
- data/spec/bitbucket_rest_api/api_spec.rb +86 -0
- data/spec/bitbucket_rest_api/authorization_spec.rb +72 -0
- data/spec/bitbucket_rest_api/client_spec.rb +15 -0
- data/spec/bitbucket_rest_api/core_ext/array_spec.rb +12 -0
- data/spec/bitbucket_rest_api/core_ext/hash_spec.rb +49 -0
- data/spec/bitbucket_rest_api/deprecation_spec.rb +30 -0
- data/spec/bitbucket_rest_api/error/bad_events_spec.rb +10 -0
- data/spec/bitbucket_rest_api/error/blank_value_spec.rb +13 -0
- data/spec/bitbucket_rest_api/error/no_events_spec.rb +10 -0
- data/spec/bitbucket_rest_api/invitations_spec.rb +21 -0
- data/spec/bitbucket_rest_api/issues/comments_spec.rb +89 -0
- data/spec/bitbucket_rest_api/issues/components_spec.rb +88 -0
- data/spec/bitbucket_rest_api/issues/milestones_spec.rb +88 -0
- data/spec/bitbucket_rest_api/issues_spec.rb +90 -0
- data/spec/bitbucket_rest_api/normalizer_spec.rb +30 -0
- data/spec/bitbucket_rest_api/parameter_filter_spec.rb +41 -0
- data/spec/bitbucket_rest_api/repos/changesets_spec.rb +43 -0
- data/spec/bitbucket_rest_api/repos/commits_spec.rb +20 -0
- data/spec/bitbucket_rest_api/repos/default_reviewers_spec.rb +64 -0
- data/spec/bitbucket_rest_api/repos/download_spec.rb +9 -0
- data/spec/bitbucket_rest_api/repos/following_spec.rb +52 -0
- data/spec/bitbucket_rest_api/repos/forks_spec.rb +45 -0
- data/spec/bitbucket_rest_api/repos/keys_spec.rb +72 -0
- data/spec/bitbucket_rest_api/repos/pull_request_spec.rb +288 -0
- data/spec/bitbucket_rest_api/repos/sources_spec.rb +77 -0
- data/spec/bitbucket_rest_api/repos/webhooks_spec.rb +245 -0
- data/spec/bitbucket_rest_api/repos_spec.rb +157 -0
- data/spec/bitbucket_rest_api/request/jsonize_spec.rb +18 -0
- data/spec/bitbucket_rest_api/request/oauth_spec.rb +27 -0
- data/spec/bitbucket_rest_api/request_spec.rb +81 -0
- data/spec/bitbucket_rest_api/response/jsonize_spec.rb +12 -0
- data/spec/bitbucket_rest_api/response/mashify_spec.rb +32 -0
- data/spec/bitbucket_rest_api/response/raise_error_spec.rb +41 -0
- data/spec/bitbucket_rest_api/user_spec.rb +77 -0
- data/spec/bitbucket_rest_api/utils/url_spec.rb +33 -0
- data/spec/bitbucket_rest_api/validations/format_spec.rb +29 -0
- data/spec/bitbucket_rest_api/validations/presence_spec.rb +12 -0
- data/spec/bitbucket_rest_api/validations/required_spec.rb +43 -0
- data/spec/bitbucket_rest_api/validations/token_spec.rb +16 -0
- data/spec/bitbucket_rest_api_spec.rb +17 -0
- data/spec/spec_helper.rb +24 -0
- metadata +373 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
module Authorization
|
5
|
+
|
6
|
+
# Check whether authentication credentials are present
|
7
|
+
def authenticated?
|
8
|
+
basic_authed? || oauth_token?
|
9
|
+
end
|
10
|
+
|
11
|
+
# Check whether basic authentication credentials are present
|
12
|
+
def basic_authed?
|
13
|
+
basic_auth? || (login? && password?)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Select authentication parameters
|
17
|
+
def authentication
|
18
|
+
if basic_auth?
|
19
|
+
{ :basic_auth => basic_auth }
|
20
|
+
elsif login? && password?
|
21
|
+
{ :login => login, :password => password }
|
22
|
+
else
|
23
|
+
{ }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def _verify_client # :nodoc:
|
30
|
+
raise ArgumentError, 'Need to provide client_id and client_secret' unless client_id? && client_secret?
|
31
|
+
end
|
32
|
+
|
33
|
+
end # Authorization
|
34
|
+
end # BitBucket
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
class Client < API
|
5
|
+
|
6
|
+
# This is a read-only API to the BitBucket events.
|
7
|
+
# These events power the various activity streams on the site.
|
8
|
+
def events(options = {})
|
9
|
+
raise "Unimplemented"
|
10
|
+
#@events ||= ApiFactory.new 'Events', options
|
11
|
+
end
|
12
|
+
|
13
|
+
def issues(options = {})
|
14
|
+
@issues ||= ApiFactory.new 'Issues', options
|
15
|
+
end
|
16
|
+
|
17
|
+
# An API for users to manage their own tokens.
|
18
|
+
def oauth(options = {})
|
19
|
+
@oauth ||= ApiFactory.new 'Request::OAuth', options
|
20
|
+
end
|
21
|
+
alias :authorizations :oauth
|
22
|
+
|
23
|
+
def teams(options = {})
|
24
|
+
raise "Unimplemented"
|
25
|
+
#@teams ||= ApiFactory.new 'teams', options
|
26
|
+
end
|
27
|
+
|
28
|
+
def pull_requests(options = {})
|
29
|
+
@pull_requests ||= ApiFactory.new 'Repos::PullRequest', options
|
30
|
+
end
|
31
|
+
|
32
|
+
def repos(options = {})
|
33
|
+
@repos ||= ApiFactory.new 'Repos', options
|
34
|
+
end
|
35
|
+
alias :repositories :repos
|
36
|
+
|
37
|
+
def search(options = {})
|
38
|
+
raise "Unimplemented"
|
39
|
+
#@search ||= ApiFactory.new 'Search', options
|
40
|
+
end
|
41
|
+
|
42
|
+
# Many of the resources on the users API provide a shortcut for getting
|
43
|
+
# information about the currently authenticated user.
|
44
|
+
def users(options = {})
|
45
|
+
@users ||= ApiFactory.new 'Users', options
|
46
|
+
end
|
47
|
+
|
48
|
+
def user_api(options = {})
|
49
|
+
@user_api ||= ApiFactory.new 'User', options
|
50
|
+
end
|
51
|
+
|
52
|
+
def invitations(options = {})
|
53
|
+
@invitations ||= ApiFactory.new "Invitations", options
|
54
|
+
end
|
55
|
+
end # Client
|
56
|
+
end # BitBucket
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
module Configuration
|
5
|
+
|
6
|
+
VALID_OPTIONS_KEYS = [
|
7
|
+
:adapter,
|
8
|
+
:client_id,
|
9
|
+
:client_secret,
|
10
|
+
:new_access_token,
|
11
|
+
:oauth_token,
|
12
|
+
:oauth_secret,
|
13
|
+
:endpoint,
|
14
|
+
:mime_type,
|
15
|
+
:user_agent,
|
16
|
+
:connection_options,
|
17
|
+
:repo,
|
18
|
+
:user,
|
19
|
+
:login,
|
20
|
+
:password,
|
21
|
+
:basic_auth
|
22
|
+
].freeze
|
23
|
+
|
24
|
+
# Other adapters are :typhoeus, :patron, :em_synchrony, :excon, :test
|
25
|
+
DEFAULT_ADAPTER = :net_http
|
26
|
+
|
27
|
+
# By default, don't set an application key
|
28
|
+
DEFAULT_CLIENT_ID = nil
|
29
|
+
|
30
|
+
# By default, don't set an application secret
|
31
|
+
DEFAULT_CLIENT_SECRET = nil
|
32
|
+
|
33
|
+
# By default, don't set an access token
|
34
|
+
DEFAULT_ACCESS_TOKEN = nil
|
35
|
+
|
36
|
+
# By default, don't set a user oauth access token
|
37
|
+
DEFAULT_OAUTH_TOKEN = nil
|
38
|
+
|
39
|
+
# By default, don't set a user oauth access token secret
|
40
|
+
DEFAULT_OAUTH_SECRET = nil
|
41
|
+
|
42
|
+
# By default, don't set a user login name
|
43
|
+
DEFAULT_LOGIN = nil
|
44
|
+
|
45
|
+
# By default, don't set a user password
|
46
|
+
DEFAULT_PASSWORD = nil
|
47
|
+
|
48
|
+
# By default, don't set a user basic authentication
|
49
|
+
DEFAULT_BASIC_AUTH = nil
|
50
|
+
|
51
|
+
# The endpoint used to connect to BitBucket if none is set, in the event that BitBucket is ever available on location
|
52
|
+
DEFAULT_ENDPOINT = 'https://api.bitbucket.org'.freeze
|
53
|
+
|
54
|
+
# The value sent in the http header for 'User-Agent' if none is set
|
55
|
+
DEFAULT_USER_AGENT = "BitBucket Ruby Gem #{BitBucket::VERSION::STRING}".freeze
|
56
|
+
|
57
|
+
# By default the <tt>Accept</tt> header will make a request for <tt>JSON</tt>
|
58
|
+
DEFAULT_MIME_TYPE = :json
|
59
|
+
|
60
|
+
# By default uses the Faraday connection options if none is set
|
61
|
+
DEFAULT_CONNECTION_OPTIONS = { }
|
62
|
+
|
63
|
+
# By default, don't set user name
|
64
|
+
DEFAULT_USER = nil
|
65
|
+
|
66
|
+
# By default, don't set repository name
|
67
|
+
DEFAULT_REPO = nil
|
68
|
+
|
69
|
+
attr_accessor *VALID_OPTIONS_KEYS
|
70
|
+
|
71
|
+
# Convenience method to allow for global setting of configuration options
|
72
|
+
def configure
|
73
|
+
yield self
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.extended(base)
|
77
|
+
base.set_defaults
|
78
|
+
end
|
79
|
+
|
80
|
+
def options
|
81
|
+
options = { }
|
82
|
+
VALID_OPTIONS_KEYS.each { |k| options[k] = send(k) }
|
83
|
+
options
|
84
|
+
end
|
85
|
+
|
86
|
+
def set_defaults
|
87
|
+
self.adapter = DEFAULT_ADAPTER
|
88
|
+
self.client_id = DEFAULT_CLIENT_ID
|
89
|
+
self.client_secret = DEFAULT_CLIENT_SECRET
|
90
|
+
self.new_access_token = DEFAULT_ACCESS_TOKEN
|
91
|
+
self.oauth_token = DEFAULT_OAUTH_TOKEN
|
92
|
+
self.oauth_secret = DEFAULT_OAUTH_SECRET
|
93
|
+
self.endpoint = DEFAULT_ENDPOINT
|
94
|
+
self.user_agent = DEFAULT_USER_AGENT
|
95
|
+
self.connection_options = DEFAULT_CONNECTION_OPTIONS
|
96
|
+
self.mime_type = DEFAULT_MIME_TYPE
|
97
|
+
self.user = DEFAULT_USER
|
98
|
+
self.repo = DEFAULT_REPO
|
99
|
+
self.login = DEFAULT_LOGIN
|
100
|
+
self.password = DEFAULT_PASSWORD
|
101
|
+
self.basic_auth = DEFAULT_BASIC_AUTH
|
102
|
+
self
|
103
|
+
end
|
104
|
+
|
105
|
+
end # Configuration
|
106
|
+
end # BitBucket
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
require 'faraday_middleware'
|
5
|
+
require 'bitbucket_rest_api/response'
|
6
|
+
require 'bitbucket_rest_api/response/mashify'
|
7
|
+
require 'bitbucket_rest_api/response/jsonize'
|
8
|
+
require 'bitbucket_rest_api/response/helpers'
|
9
|
+
require 'bitbucket_rest_api/response/raise_error'
|
10
|
+
require 'bitbucket_rest_api/request/oauth'
|
11
|
+
require 'bitbucket_rest_api/request/basic_auth'
|
12
|
+
require 'bitbucket_rest_api/request/jsonize'
|
13
|
+
|
14
|
+
module BitBucket
|
15
|
+
module Connection
|
16
|
+
extend self
|
17
|
+
include BitBucket::Constants
|
18
|
+
|
19
|
+
ALLOWED_OPTIONS = [
|
20
|
+
:headers,
|
21
|
+
:url,
|
22
|
+
:params,
|
23
|
+
:request,
|
24
|
+
:ssl
|
25
|
+
].freeze
|
26
|
+
|
27
|
+
def default_options(options={})
|
28
|
+
{
|
29
|
+
:headers => {
|
30
|
+
USER_AGENT => user_agent
|
31
|
+
},
|
32
|
+
:ssl => { :verify => false },
|
33
|
+
:url => options.fetch(:endpoint) { BitBucket.endpoint }
|
34
|
+
}.merge(options)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Default middleware stack that uses default adapter as specified at
|
38
|
+
# configuration stage.
|
39
|
+
#
|
40
|
+
def default_middleware(options={})
|
41
|
+
Proc.new do |builder|
|
42
|
+
#builder.use BitBucket::Request::Jsonize
|
43
|
+
builder.use Faraday::Request::Multipart
|
44
|
+
builder.use Faraday::Request::UrlEncoded
|
45
|
+
builder.use FaradayMiddleware::OAuth, {:consumer_key => client_id, :consumer_secret => client_secret, :token => oauth_token, :token_secret => oauth_secret} if client_id? and client_secret?
|
46
|
+
builder.use BitBucket::Request::BasicAuth, authentication if basic_authed?
|
47
|
+
builder.use FaradayMiddleware::EncodeJson
|
48
|
+
|
49
|
+
builder.use Faraday::Response::Logger if ENV['DEBUG']
|
50
|
+
builder.use BitBucket::Response::Helpers
|
51
|
+
unless options[:raw]
|
52
|
+
builder.use BitBucket::Response::Mashify
|
53
|
+
builder.use BitBucket::Response::Jsonize
|
54
|
+
end
|
55
|
+
builder.use BitBucket::Response::RaiseError
|
56
|
+
builder.adapter adapter
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
@connection = nil
|
61
|
+
|
62
|
+
@stack = nil
|
63
|
+
|
64
|
+
def clear_cache
|
65
|
+
@connection = nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def caching?
|
69
|
+
!@connection.nil?
|
70
|
+
end
|
71
|
+
|
72
|
+
# Exposes middleware builder to facilitate custom stacks and easy
|
73
|
+
# addition of new extensions such as cache adapter.
|
74
|
+
#
|
75
|
+
def stack(options={}, &block)
|
76
|
+
@stack ||= begin
|
77
|
+
if block_given?
|
78
|
+
Faraday::RackBuilder.new(&block)
|
79
|
+
else
|
80
|
+
Faraday::RackBuilder.new(&default_middleware(options))
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns a Fraday::Connection object
|
86
|
+
#
|
87
|
+
def connection(options = {})
|
88
|
+
conn_options = default_options(options)
|
89
|
+
clear_cache unless options.empty?
|
90
|
+
puts "OPTIONS:#{conn_options.inspect}" if ENV['DEBUG']
|
91
|
+
|
92
|
+
@connection ||= Faraday.new(conn_options.merge(:builder => stack(options))) do |faraday|
|
93
|
+
faraday.response :logger if ENV['DEBUG']
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end # Connection
|
98
|
+
end # BitBucket
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module BitBucket
|
2
|
+
module Constants
|
3
|
+
extend self
|
4
|
+
|
5
|
+
# Response headers
|
6
|
+
RATELIMIT_REMAINING = 'X-RateLimit-Remaining'.freeze
|
7
|
+
|
8
|
+
RATELIMIT_LIMIT = 'X-RateLimit-Limit'.freeze
|
9
|
+
|
10
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
11
|
+
|
12
|
+
CONTENT_LENGTH = 'content-length'.freeze
|
13
|
+
|
14
|
+
CACHE_CONTROL = 'cache-control'.freeze
|
15
|
+
|
16
|
+
ETAG = 'ETag'.freeze
|
17
|
+
|
18
|
+
SERVER = 'Server'.freeze
|
19
|
+
|
20
|
+
DATE = 'Date'.freeze
|
21
|
+
|
22
|
+
LOCATION = 'Location'.freeze
|
23
|
+
|
24
|
+
USER_AGENT = 'User-Agent'.freeze
|
25
|
+
|
26
|
+
ACCEPT = 'Accept'.freeze
|
27
|
+
|
28
|
+
ACCEPT_CHARSET = 'Accept-Charset'.freeze
|
29
|
+
|
30
|
+
# Link headers
|
31
|
+
HEADER_LINK = "Link".freeze
|
32
|
+
|
33
|
+
HEADER_NEXT = "X-Next".freeze
|
34
|
+
|
35
|
+
HEADER_LAST = "X-Last".freeze
|
36
|
+
|
37
|
+
META_REL = "rel".freeze
|
38
|
+
|
39
|
+
META_LAST = "last".freeze
|
40
|
+
|
41
|
+
META_NEXT = "next".freeze
|
42
|
+
|
43
|
+
META_FIRST = "first".freeze
|
44
|
+
|
45
|
+
META_PREV = "prev".freeze
|
46
|
+
|
47
|
+
PARAM_PAGE = "page".freeze
|
48
|
+
|
49
|
+
PARAM_PER_PAGE = "per_page".freeze
|
50
|
+
|
51
|
+
PARAM_START_PAGE = "start_page".freeze
|
52
|
+
|
53
|
+
# URI parsing
|
54
|
+
QUERY_STR_SEP = '?'.freeze
|
55
|
+
|
56
|
+
|
57
|
+
end # Constants
|
58
|
+
end # BitBucket
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Hash # :nodoc:
|
2
|
+
|
3
|
+
def symbolize_keys # :nodoc:
|
4
|
+
inject({}) do |hash, (key, value)|
|
5
|
+
hash[(key.to_sym rescue key) || key] = value
|
6
|
+
hash
|
7
|
+
end
|
8
|
+
end unless method_defined?(:symbolize_keys)
|
9
|
+
|
10
|
+
def symbolize_keys! # :nodoc:
|
11
|
+
hash = symbolize_keys
|
12
|
+
hash.each do |key, val|
|
13
|
+
hash[key] = case val
|
14
|
+
when Hash
|
15
|
+
val.symbolize_keys!
|
16
|
+
when Array
|
17
|
+
val.map do |item|
|
18
|
+
item.is_a?(Hash) ? item.symbolize_keys! : item
|
19
|
+
end
|
20
|
+
else
|
21
|
+
val
|
22
|
+
end
|
23
|
+
end
|
24
|
+
return hash
|
25
|
+
end unless method_defined?(:symbolize_keys!)
|
26
|
+
|
27
|
+
def serialize # :nodoc:
|
28
|
+
self.map { |key, val| [key, val].join("=") }.join("&")
|
29
|
+
end unless method_defined?(:serialize)
|
30
|
+
|
31
|
+
def all_keys # :nodoc:
|
32
|
+
keys = self.keys
|
33
|
+
keys.each do |key|
|
34
|
+
if self[key].is_a?(Hash)
|
35
|
+
keys << self[key].all_keys.compact.flatten
|
36
|
+
next
|
37
|
+
end
|
38
|
+
end
|
39
|
+
keys.flatten
|
40
|
+
end unless method_defined?(:all_keys)
|
41
|
+
|
42
|
+
def has_deep_key?(key)
|
43
|
+
self.all_keys.include? key
|
44
|
+
end unless method_defined?(:has_deep_key?)
|
45
|
+
|
46
|
+
end # Hash
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
|
5
|
+
DEPRECATION_PREFIX = "[BitBucketAPI] Deprecation warning:"
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
attr_writer :deprecation_tracker
|
10
|
+
|
11
|
+
def deprecation_tracker
|
12
|
+
@deprecation_tracker ||= []
|
13
|
+
end
|
14
|
+
|
15
|
+
# Displays deprecation message to the user.
|
16
|
+
# Each message is printed once.
|
17
|
+
def deprecate(method, alternate_method=nil)
|
18
|
+
return if deprecation_tracker.include? method
|
19
|
+
deprecation_tracker << method
|
20
|
+
|
21
|
+
message = <<-NOTICE
|
22
|
+
#{DEPRECATION_PREFIX}
|
23
|
+
|
24
|
+
* #{method} is deprecated.
|
25
|
+
NOTICE
|
26
|
+
if alternate_method
|
27
|
+
message << <<-ADDITIONAL
|
28
|
+
* please use #{alternate_method} instead.
|
29
|
+
ADDITIONAL
|
30
|
+
end
|
31
|
+
warn_deprecation(message)
|
32
|
+
end
|
33
|
+
|
34
|
+
def warn_deprecation(message)
|
35
|
+
send :warn, message
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end # BitBucket
|