bitbucket_rest_api 0.1.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.
- data/README.md +163 -0
- data/lib/bitbucket_rest_api/api/actions.rb +50 -0
- data/lib/bitbucket_rest_api/api.rb +121 -0
- data/lib/bitbucket_rest_api/api_factory.rb +30 -0
- data/lib/bitbucket_rest_api/authorization.rb +49 -0
- data/lib/bitbucket_rest_api/client.rb +52 -0
- data/lib/bitbucket_rest_api/compatibility.rb +23 -0
- data/lib/bitbucket_rest_api/configuration.rb +101 -0
- data/lib/bitbucket_rest_api/connection.rb +97 -0
- data/lib/bitbucket_rest_api/constants.rb +58 -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/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/issues.rb +201 -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/changesets.rb +54 -0
- data/lib/bitbucket_rest_api/repos/following.rb +39 -0
- data/lib/bitbucket_rest_api/repos/keys.rb +87 -0
- data/lib/bitbucket_rest_api/repos.rb +213 -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 +49 -0
- data/lib/bitbucket_rest_api/request.rb +67 -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/result.rb +140 -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 +25 -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 +87 -0
- metadata +266 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
class Issues::Components < API
|
5
|
+
|
6
|
+
VALID_COMPONENT_INPUTS = %w[ name ].freeze
|
7
|
+
|
8
|
+
# Creates new Issues::Components API
|
9
|
+
def initialize(options = {})
|
10
|
+
super(options)
|
11
|
+
end
|
12
|
+
# List all components for a repository
|
13
|
+
#
|
14
|
+
# = Examples
|
15
|
+
# bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
|
16
|
+
# bitbucket.issues.components.list
|
17
|
+
# bitbucket.issues.components.list { |component| ... }
|
18
|
+
#
|
19
|
+
def list(user_name, repo_name, params={})
|
20
|
+
_update_user_repo_params(user_name, repo_name)
|
21
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
22
|
+
normalize! params
|
23
|
+
|
24
|
+
response = get_request("/repositories/#{user}/#{repo}/issues/components", params)
|
25
|
+
return response unless block_given?
|
26
|
+
response.each { |el| yield el }
|
27
|
+
end
|
28
|
+
alias :all :list
|
29
|
+
|
30
|
+
# Get a single component
|
31
|
+
#
|
32
|
+
# = Examples
|
33
|
+
# bitbucket = BitBucket.new
|
34
|
+
# bitbucket.issues.components.find 'user-name', 'repo-name', 'component-id'
|
35
|
+
#
|
36
|
+
def get(user_name, repo_name, component_id, params={})
|
37
|
+
_update_user_repo_params(user_name, repo_name)
|
38
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
39
|
+
_validate_presence_of component_id
|
40
|
+
normalize! params
|
41
|
+
|
42
|
+
get_request("/repositories/#{user}/#{repo}/issues/components/#{component_id}", params)
|
43
|
+
end
|
44
|
+
alias :find :get
|
45
|
+
|
46
|
+
# Create a component
|
47
|
+
#
|
48
|
+
# = Inputs
|
49
|
+
# <tt>:name</tt> - Required string
|
50
|
+
#
|
51
|
+
# = Examples
|
52
|
+
# bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
|
53
|
+
# bitbucket.issues.components.create :name => 'API'
|
54
|
+
#
|
55
|
+
def create(user_name, repo_name, params={})
|
56
|
+
_update_user_repo_params(user_name, repo_name)
|
57
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
58
|
+
|
59
|
+
normalize! params
|
60
|
+
filter! VALID_COMPONENT_INPUTS, params
|
61
|
+
assert_required_keys(VALID_COMPONENT_INPUTS, params)
|
62
|
+
|
63
|
+
post_request("/repositories/#{user}/#{repo}/issues/components", params)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Update a component
|
67
|
+
#
|
68
|
+
# = Inputs
|
69
|
+
# <tt>:name</tt> - Required string
|
70
|
+
#
|
71
|
+
# = Examples
|
72
|
+
# @bitbucket = BitBucket.new
|
73
|
+
# @bitbucket.issues.components.update 'user-name', 'repo-name', 'component-id',
|
74
|
+
# :name => 'API'
|
75
|
+
#
|
76
|
+
def update(user_name, repo_name, component_id, params={})
|
77
|
+
_update_user_repo_params(user_name, repo_name)
|
78
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
79
|
+
_validate_presence_of component_id
|
80
|
+
|
81
|
+
normalize! params
|
82
|
+
filter! VALID_COMPONENT_INPUTS, params
|
83
|
+
assert_required_keys(VALID_COMPONENT_INPUTS, params)
|
84
|
+
|
85
|
+
put_request("/repositories/#{user}/#{repo}/issues/components/#{component_id}", params)
|
86
|
+
end
|
87
|
+
alias :edit :update
|
88
|
+
|
89
|
+
# Delete a component
|
90
|
+
#
|
91
|
+
# = Examples
|
92
|
+
# bitbucket = BitBucket.new
|
93
|
+
# bitbucket.issues.components.delete 'user-name', 'repo-name', 'component-id'
|
94
|
+
#
|
95
|
+
def delete(user_name, repo_name, component_id, params={})
|
96
|
+
_update_user_repo_params(user_name, repo_name)
|
97
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
98
|
+
|
99
|
+
_validate_presence_of component_id
|
100
|
+
normalize! params
|
101
|
+
|
102
|
+
delete_request("/repositories/#{user}/#{repo}/labels/components/#{component_id}", params)
|
103
|
+
end
|
104
|
+
|
105
|
+
end # Issues::Components
|
106
|
+
end # BitBucket
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
class Issues::Milestones < API
|
5
|
+
|
6
|
+
VALID_MILESTONE_INPUTS = %w[
|
7
|
+
name
|
8
|
+
].freeze # :nodoc:
|
9
|
+
|
10
|
+
# Creates new Issues::Milestones API
|
11
|
+
def initialize(options = {})
|
12
|
+
super(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
# List milestones for a repository
|
16
|
+
#
|
17
|
+
# = Examples
|
18
|
+
# bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
|
19
|
+
# bitbucket.issues.milestones.list
|
20
|
+
#
|
21
|
+
def list(user_name, repo_name, params={})
|
22
|
+
_update_user_repo_params(user_name, repo_name)
|
23
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
24
|
+
|
25
|
+
normalize! params
|
26
|
+
|
27
|
+
response = get_request("/repositories/#{user}/#{repo}/issues/milestones", params)
|
28
|
+
return response unless block_given?
|
29
|
+
response.each { |el| yield el }
|
30
|
+
end
|
31
|
+
alias :all :list
|
32
|
+
|
33
|
+
# Get a single milestone
|
34
|
+
#
|
35
|
+
# = Examples
|
36
|
+
# bitbucket = BitBucket.new
|
37
|
+
# bitbucket.issues.milestones.get 'user-name', 'repo-name', 'milestone-id'
|
38
|
+
#
|
39
|
+
def get(user_name, repo_name, milestone_id, params={})
|
40
|
+
_update_user_repo_params(user_name, repo_name)
|
41
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
42
|
+
_validate_presence_of milestone_id
|
43
|
+
normalize! params
|
44
|
+
|
45
|
+
get_request("/repositories/#{user}/#{repo}/issues/milestones/#{milestone_id}", params)
|
46
|
+
end
|
47
|
+
alias :find :get
|
48
|
+
|
49
|
+
# Create a milestone
|
50
|
+
#
|
51
|
+
# = Inputs
|
52
|
+
# <tt>:name</tt> - Required string
|
53
|
+
#
|
54
|
+
# = Examples
|
55
|
+
# bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
|
56
|
+
# bitbucket.issues.milestones.create :name => 'hello-world'
|
57
|
+
#
|
58
|
+
def create(user_name, repo_name, params={})
|
59
|
+
_update_user_repo_params(user_name, repo_name)
|
60
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
61
|
+
|
62
|
+
normalize! params
|
63
|
+
filter! VALID_MILESTONE_INPUTS, params
|
64
|
+
assert_required_keys(%w[ name ], params)
|
65
|
+
|
66
|
+
post_request("/repositories/#{user}/#{repo}/issues/milestones", params)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Update a milestone
|
70
|
+
#
|
71
|
+
# = Inputs
|
72
|
+
# <tt>:name</tt> - Required string
|
73
|
+
#
|
74
|
+
# = Examples
|
75
|
+
# bitbucket = BitBucket.new
|
76
|
+
# bitbucket.issues.milestones.update 'user-name', 'repo-name', 'milestone-id',
|
77
|
+
# :name => 'hello-world'
|
78
|
+
#
|
79
|
+
def update(user_name, repo_name, milestone_id, params={})
|
80
|
+
_update_user_repo_params(user_name, repo_name)
|
81
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
82
|
+
_validate_presence_of milestone_id
|
83
|
+
|
84
|
+
normalize! params
|
85
|
+
filter! VALID_MILESTONE_INPUTS, params
|
86
|
+
assert_required_keys(%w[ name ], params)
|
87
|
+
|
88
|
+
put_request("/repositories/#{user}/#{repo}/issues/milestones/#{milestone_id}", params)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Delete a milestone
|
92
|
+
#
|
93
|
+
# = Examples
|
94
|
+
# bitbucket = BitBucket.new
|
95
|
+
# bitbucket.issues.milestones.delete 'user-name', 'repo-name', 'milestone-id'
|
96
|
+
#
|
97
|
+
def delete(user_name, repo_name, milestone_id, params={})
|
98
|
+
_update_user_repo_params(user_name, repo_name)
|
99
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
100
|
+
_validate_presence_of milestone_id
|
101
|
+
normalize! params
|
102
|
+
|
103
|
+
delete_request("/repositories/#{user}/#{repo}/issues/milestones/#{milestone_id}", params)
|
104
|
+
end
|
105
|
+
|
106
|
+
end # Issues::Milestones
|
107
|
+
end # BitBucket
|
@@ -0,0 +1,201 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
class Issues < API
|
5
|
+
extend AutoloadHelper
|
6
|
+
|
7
|
+
autoload_all 'bitbucket_rest_api/issues',
|
8
|
+
:Comments => 'comments',
|
9
|
+
:Components => 'Components',
|
10
|
+
:Milestones => 'milestones'
|
11
|
+
|
12
|
+
VALID_ISSUE_PARAM_NAMES = %w[
|
13
|
+
filter
|
14
|
+
state
|
15
|
+
labels
|
16
|
+
sort
|
17
|
+
direction
|
18
|
+
since
|
19
|
+
milestone
|
20
|
+
assignee
|
21
|
+
mentioned
|
22
|
+
title
|
23
|
+
body
|
24
|
+
resource
|
25
|
+
mime_type
|
26
|
+
].freeze
|
27
|
+
|
28
|
+
VALID_ISSUE_PARAM_VALUES = {
|
29
|
+
'filter' => %w[ assigned created mentioned subscribed ],
|
30
|
+
'state' => %w[ open closed ],
|
31
|
+
'sort' => %w[ created updated comments ],
|
32
|
+
'direction' => %w[ desc asc ],
|
33
|
+
'since' => %r{\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z}
|
34
|
+
}
|
35
|
+
|
36
|
+
# Creates new Issues API
|
37
|
+
def initialize(options = { })
|
38
|
+
super(options)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Access to Issues::Comments API
|
42
|
+
def comments
|
43
|
+
@comments ||= ApiFactory.new 'Issues::Comments'
|
44
|
+
end
|
45
|
+
|
46
|
+
# Access to Issues::Components API
|
47
|
+
def components
|
48
|
+
@components ||= ApiFactory.new 'Issues::Components'
|
49
|
+
end
|
50
|
+
|
51
|
+
# Access to Issues::Milestones API
|
52
|
+
def milestones
|
53
|
+
@milestones ||= ApiFactory.new 'Issues::Milestones'
|
54
|
+
end
|
55
|
+
|
56
|
+
# List issues for a repository
|
57
|
+
#
|
58
|
+
# = Parameters
|
59
|
+
# <tt>:filter</tt> - Optional See https://confluence.atlassian.com/display/BITBUCKET/Issues#Issues-Filtering for building the filter string
|
60
|
+
#
|
61
|
+
# = Examples
|
62
|
+
# bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
|
63
|
+
# bitbucket.issues.list_repo :filter => 'kind=bug&kind=enhancement'
|
64
|
+
#
|
65
|
+
def list_repo(user_name, repo_name, params={ })
|
66
|
+
_update_user_repo_params(user_name, repo_name)
|
67
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
68
|
+
|
69
|
+
normalize! params
|
70
|
+
filter! VALID_ISSUE_PARAM_NAMES, params
|
71
|
+
# _merge_mime_type(:issue, params)
|
72
|
+
assert_valid_values(VALID_ISSUE_PARAM_VALUES, params)
|
73
|
+
|
74
|
+
response = get_request("/repositories/#{user}/#{repo}/issues", params)
|
75
|
+
return response unless block_given?
|
76
|
+
response.each { |el| yield el }
|
77
|
+
end
|
78
|
+
|
79
|
+
alias :list_repository :list_repo
|
80
|
+
|
81
|
+
# Get a single issue
|
82
|
+
#
|
83
|
+
# = Examples
|
84
|
+
# bitbucket = BitBucket.new
|
85
|
+
# bitbucket.issues.get 'user-name', 'repo-name', 'issue-id'
|
86
|
+
#
|
87
|
+
def get(user_name, repo_name, issue_id, params={ })
|
88
|
+
_update_user_repo_params(user_name, repo_name)
|
89
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
90
|
+
_validate_presence_of issue_id
|
91
|
+
|
92
|
+
normalize! params
|
93
|
+
# _merge_mime_type(:issue, params)
|
94
|
+
|
95
|
+
get_request("/repositories/#{user}/#{repo}/issues/#{issue_id}", params)
|
96
|
+
end
|
97
|
+
|
98
|
+
alias :find :get
|
99
|
+
|
100
|
+
# Create an issue
|
101
|
+
#
|
102
|
+
# = Inputs
|
103
|
+
# <tt>:title</tt> - Required string
|
104
|
+
# <tt>:content</tt> - Optional string
|
105
|
+
# <tt>:responsible</tt> - Optional string - Login for the user that this issue should be assigned to.
|
106
|
+
# <tt>:milestone</tt> - Optional number - Milestone to associate this issue with
|
107
|
+
# <tt>:version</tt> - Optional number - Version to associate this issue with
|
108
|
+
# <tt>:component</tt> - Optional number - Component to associate this issue with
|
109
|
+
# <tt>:priority</tt> - Optional string - The priority of this issue
|
110
|
+
# * <tt>trivial</tt>
|
111
|
+
# * <tt>minor</tt>
|
112
|
+
# * <tt>major</tt>
|
113
|
+
# * <tt>critical</tt>
|
114
|
+
# * <tt>blocker</tt>
|
115
|
+
# <tt>:status</tt> - Optional string - The status of this issue
|
116
|
+
# * <tt>new</tt>
|
117
|
+
# * <tt>open</tt>
|
118
|
+
# * <tt>resolved</tt>
|
119
|
+
# * <tt>on hold</tt>
|
120
|
+
# * <tt>invalid</tt>
|
121
|
+
# * <tt>duplicate</tt>
|
122
|
+
# * <tt>wontfix</tt>
|
123
|
+
# <tt>:kind</tt> - Optional string - The kind of issue
|
124
|
+
# * <tt>bug</tt>
|
125
|
+
# * <tt>enhancement</tt>
|
126
|
+
# * <tt>proposal</tt>
|
127
|
+
# * <tt>task</tt>
|
128
|
+
#
|
129
|
+
# = Examples
|
130
|
+
# bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
|
131
|
+
# bitbucket.issues.create
|
132
|
+
# "title" => "Found a bug",
|
133
|
+
# "content" => "I'm having a problem with this.",
|
134
|
+
# "responsible" => "octocat",
|
135
|
+
# "milestone" => 1,
|
136
|
+
# "priority" => "blocker"
|
137
|
+
#
|
138
|
+
def create(user_name, repo_name, params={ })
|
139
|
+
_update_user_repo_params(user_name, repo_name)
|
140
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
141
|
+
|
142
|
+
normalize! params
|
143
|
+
# _merge_mime_type(:issue, params)
|
144
|
+
filter! VALID_ISSUE_PARAM_NAMES, params
|
145
|
+
assert_required_keys(%w[ title ], params)
|
146
|
+
|
147
|
+
post_request("/repositories/#{user}/#{repo}/issues", params)
|
148
|
+
end
|
149
|
+
|
150
|
+
# Edit an issue
|
151
|
+
#
|
152
|
+
# = Inputs
|
153
|
+
# <tt>:title</tt> - Required string
|
154
|
+
# <tt>:content</tt> - Optional string
|
155
|
+
# <tt>:responsible</tt> - Optional string - Login for the user that this issue should be assigned to.
|
156
|
+
# <tt>:milestone</tt> - Optional number - Milestone to associate this issue with
|
157
|
+
# <tt>:version</tt> - Optional number - Version to associate this issue with
|
158
|
+
# <tt>:component</tt> - Optional number - Component to associate this issue with
|
159
|
+
# <tt>:priority</tt> - Optional string - The priority of this issue
|
160
|
+
# * <tt>trivial</tt>
|
161
|
+
# * <tt>minor</tt>
|
162
|
+
# * <tt>major</tt>
|
163
|
+
# * <tt>critical</tt>
|
164
|
+
# * <tt>blocker</tt>
|
165
|
+
# <tt>:status</tt> - Optional string - The status of this issue
|
166
|
+
# * <tt>new</tt>
|
167
|
+
# * <tt>open</tt>
|
168
|
+
# * <tt>resolved</tt>
|
169
|
+
# * <tt>on hold</tt>
|
170
|
+
# * <tt>invalid</tt>
|
171
|
+
# * <tt>duplicate</tt>
|
172
|
+
# * <tt>wontfix</tt>
|
173
|
+
# <tt>:kind</tt> - Optional string - The kind of issue
|
174
|
+
# * <tt>bug</tt>
|
175
|
+
# * <tt>enhancement</tt>
|
176
|
+
# * <tt>proposal</tt>
|
177
|
+
# * <tt>task</tt>
|
178
|
+
#
|
179
|
+
# = Examples
|
180
|
+
# bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
|
181
|
+
# bitbucket.issues.create
|
182
|
+
# "title" => "Found a bug",
|
183
|
+
# "content" => "I'm having a problem with this.",
|
184
|
+
# "responsible" => "octocat",
|
185
|
+
# "milestone" => 1,
|
186
|
+
# "priority" => "blocker"
|
187
|
+
#
|
188
|
+
def edit(user_name, repo_name, issue_id, params={ })
|
189
|
+
_update_user_repo_params(user_name, repo_name)
|
190
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
191
|
+
_validate_presence_of issue_id
|
192
|
+
|
193
|
+
normalize! params
|
194
|
+
# _merge_mime_type(:issue, params)
|
195
|
+
filter! VALID_ISSUE_PARAM_NAMES, params
|
196
|
+
|
197
|
+
put_request("/repositories/#{user}/#{repo}/issues/#{issue_id}/", params)
|
198
|
+
end
|
199
|
+
|
200
|
+
end # Issues
|
201
|
+
end # BitBucket
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
# Deals with normalizing client supplied parameter keys.
|
5
|
+
module Normalizer
|
6
|
+
|
7
|
+
# Turns any keys from nested hashes including nested arrays into strings
|
8
|
+
#
|
9
|
+
def normalize!(params)
|
10
|
+
case params
|
11
|
+
when Hash
|
12
|
+
params.keys.each do |k|
|
13
|
+
params[k.to_s] = params.delete(k)
|
14
|
+
normalize!(params[k.to_s])
|
15
|
+
end
|
16
|
+
when Array
|
17
|
+
params.map! do |el|
|
18
|
+
normalize!(el)
|
19
|
+
end
|
20
|
+
else
|
21
|
+
params.to_s
|
22
|
+
end
|
23
|
+
return params
|
24
|
+
end
|
25
|
+
|
26
|
+
end # Normalizer
|
27
|
+
end # BitBucket
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
# Allows you to specify parameters keys which will be preserved
|
5
|
+
# in parameters hash and its subhashes. Any keys from the nested
|
6
|
+
# hash that do not match will be removed.
|
7
|
+
module ParameterFilter
|
8
|
+
|
9
|
+
# Removes any keys from nested hashes that don't match predefiend keys
|
10
|
+
#
|
11
|
+
def filter!(keys, params, options={:recursive => true}) # :nodoc:
|
12
|
+
case params
|
13
|
+
when Hash
|
14
|
+
params.keys.each do |k, v|
|
15
|
+
unless (keys.include?(k) or BitBucket::Validations::VALID_API_KEYS.include?(k))
|
16
|
+
params.delete(k)
|
17
|
+
else
|
18
|
+
filter!(keys, params[k]) if options[:recursive]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
when Array
|
22
|
+
params.map! do |el|
|
23
|
+
filter!(keys, el) if options[:recursive]
|
24
|
+
end
|
25
|
+
else
|
26
|
+
params
|
27
|
+
end
|
28
|
+
return params
|
29
|
+
end
|
30
|
+
|
31
|
+
end # Filter
|
32
|
+
end # BitBucket
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
class Repos::Changesets < API
|
5
|
+
|
6
|
+
REQUIRED_COMMENT_PARAMS = %w[
|
7
|
+
body
|
8
|
+
changeset_id
|
9
|
+
line
|
10
|
+
path
|
11
|
+
position
|
12
|
+
].freeze
|
13
|
+
|
14
|
+
# List changesets on a repository
|
15
|
+
#
|
16
|
+
# = Parameters
|
17
|
+
# * <tt>:sha</tt> Optional string. Sha or branch to start listing changesets from.
|
18
|
+
# * <tt>:path</tt> Optional string. Only changesets containing this file path will be returned
|
19
|
+
#
|
20
|
+
# = Examples
|
21
|
+
# bitbucket = BitBucket.new
|
22
|
+
# bitbucket.repos.changesets.list 'user-name', 'repo-name', :sha => '...'
|
23
|
+
# bitbucket.repos.changesets.list 'user-name', 'repo-name', :sha => '...' { |changeset| ... }
|
24
|
+
#
|
25
|
+
def list(user_name, repo_name, params={})
|
26
|
+
_update_user_repo_params(user_name, repo_name)
|
27
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
28
|
+
normalize! params
|
29
|
+
filter! %w[ sha path], params
|
30
|
+
|
31
|
+
response = get_request("/repositories/#{user}/#{repo}/changesets", params)
|
32
|
+
return response unless block_given?
|
33
|
+
response.each { |el| yield el }
|
34
|
+
end
|
35
|
+
alias :all :list
|
36
|
+
|
37
|
+
# Gets a single changeset
|
38
|
+
#
|
39
|
+
# = Examples
|
40
|
+
# @bitbucket = BitBucket.new
|
41
|
+
# @bitbucket.repos.changesets.get 'user-name', 'repo-name', '6dcb09b5b57875f334f61aebed6')
|
42
|
+
#
|
43
|
+
def get(user_name, repo_name, sha, params={})
|
44
|
+
_update_user_repo_params(user_name, repo_name)
|
45
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
46
|
+
_validate_presence_of sha
|
47
|
+
normalize! params
|
48
|
+
|
49
|
+
get_request("/repositories/#{user}/#{repo}/changesets/#{sha}", params)
|
50
|
+
end
|
51
|
+
alias :find :get
|
52
|
+
|
53
|
+
end # Repos::Commits
|
54
|
+
end # BitBucket
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
class Repos::Following < API
|
5
|
+
|
6
|
+
# List repo followers
|
7
|
+
#
|
8
|
+
# = Examples
|
9
|
+
# bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
|
10
|
+
# bitbucket.repos.following.followers
|
11
|
+
# bitbucket.repos.following.followers { |watcher| ... }
|
12
|
+
#
|
13
|
+
def followers(user_name, repo_name, params={})
|
14
|
+
_update_user_repo_params(user_name, repo_name)
|
15
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
16
|
+
normalize! params
|
17
|
+
|
18
|
+
response = get_request("/repositories/#{user}/#{repo}/followers/", params)
|
19
|
+
return response unless block_given?
|
20
|
+
response.each { |el| yield el }
|
21
|
+
end
|
22
|
+
|
23
|
+
# List repos being followed by the authenticated user
|
24
|
+
#
|
25
|
+
# = Examples
|
26
|
+
# bitbucket = BitBucket.new :oauth_token => '...', :oauth_secret => '...'
|
27
|
+
# bitbucket.repos.following.followed
|
28
|
+
#
|
29
|
+
def followed(*args)
|
30
|
+
params = args.extract_options!
|
31
|
+
normalize! params
|
32
|
+
|
33
|
+
response = get_request("/user/follows", params)
|
34
|
+
return response unless block_given?
|
35
|
+
response.each { |el| yield el }
|
36
|
+
end
|
37
|
+
|
38
|
+
end # Repos::Watching
|
39
|
+
end # BitBucket
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BitBucket
|
4
|
+
class Repos::Keys < API
|
5
|
+
|
6
|
+
VALID_KEY_PARAM_NAMES = %w[ label key ].freeze
|
7
|
+
|
8
|
+
# List deploy keys
|
9
|
+
#
|
10
|
+
# = Examples
|
11
|
+
# bitbucket = BitBucket.new
|
12
|
+
# bitbucket.repos.keys.list 'user-name', 'repo-name'
|
13
|
+
# bitbucket.repos.keys.list 'user-name', 'repo-name' { |key| ... }
|
14
|
+
#
|
15
|
+
def list(user_name, repo_name, params={})
|
16
|
+
_update_user_repo_params(user_name, repo_name)
|
17
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
18
|
+
normalize! params
|
19
|
+
|
20
|
+
response = get_request("/repositories/#{user}/#{repo}/deploy-keys/", params)
|
21
|
+
return response unless block_given?
|
22
|
+
response.each { |el| yield el }
|
23
|
+
end
|
24
|
+
alias :all :list
|
25
|
+
|
26
|
+
# Create a key
|
27
|
+
#
|
28
|
+
# = Inputs
|
29
|
+
# * <tt>:title</tt> - Required string.
|
30
|
+
# * <tt>:key</tt> - Required string.
|
31
|
+
#
|
32
|
+
# = Examples
|
33
|
+
# bitbucket = BitBucket.new
|
34
|
+
# bitbucket.repos.keys.create 'user-name', 'repo-name',
|
35
|
+
# "label" => "octocat@octomac",
|
36
|
+
# "key" => "ssh-rsa AAA..."
|
37
|
+
#
|
38
|
+
def create(user_name, repo_name, params={})
|
39
|
+
_update_user_repo_params(user_name, repo_name)
|
40
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
41
|
+
normalize! params
|
42
|
+
filter! VALID_KEY_PARAM_NAMES, params
|
43
|
+
assert_required_keys(VALID_KEY_PARAM_NAMES, params)
|
44
|
+
|
45
|
+
post_request("/repositories/#{user}/#{repo}/deploy-keys/", params)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Edit a key
|
49
|
+
#
|
50
|
+
# = Inputs
|
51
|
+
# * <tt>:title</tt> - Required string.
|
52
|
+
# * <tt>:key</tt> - Required string.
|
53
|
+
#
|
54
|
+
# = Examples
|
55
|
+
# bitbucket = BitBucket.new
|
56
|
+
# bitbucket.repos.keys.edit 'user-name', 'repo-name',
|
57
|
+
# "label" => "octocat@octomac",
|
58
|
+
# "key" => "ssh-rsa AAA..."
|
59
|
+
#
|
60
|
+
def edit(user_name, repo_name, key_id, params={})
|
61
|
+
_update_user_repo_params(user_name, repo_name)
|
62
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
63
|
+
_validate_presence_of key_id
|
64
|
+
|
65
|
+
normalize! params
|
66
|
+
filter! VALID_KEY_PARAM_NAMES, params
|
67
|
+
|
68
|
+
put_request("/repositories/#{user}/#{repo}/deploy-keys/#{key_id}", params)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Delete key
|
72
|
+
#
|
73
|
+
# = Examples
|
74
|
+
# @bitbucket = BitBucket.new
|
75
|
+
# @bitbucket.repos.keys.delete 'user-name', 'repo-name', 'key-id'
|
76
|
+
#
|
77
|
+
def delete(user_name, repo_name, key_id, params={})
|
78
|
+
_update_user_repo_params(user_name, repo_name)
|
79
|
+
_validate_user_repo_params(user, repo) unless user? && repo?
|
80
|
+
_validate_presence_of key_id
|
81
|
+
normalize! params
|
82
|
+
|
83
|
+
delete_request("/repositories/#{user}/#{repo}/deploy-keys/#{key_id}", params)
|
84
|
+
end
|
85
|
+
|
86
|
+
end # Repos::Keys
|
87
|
+
end # BitBucket
|