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.
Files changed (58) hide show
  1. data/README.md +163 -0
  2. data/lib/bitbucket_rest_api/api/actions.rb +50 -0
  3. data/lib/bitbucket_rest_api/api.rb +121 -0
  4. data/lib/bitbucket_rest_api/api_factory.rb +30 -0
  5. data/lib/bitbucket_rest_api/authorization.rb +49 -0
  6. data/lib/bitbucket_rest_api/client.rb +52 -0
  7. data/lib/bitbucket_rest_api/compatibility.rb +23 -0
  8. data/lib/bitbucket_rest_api/configuration.rb +101 -0
  9. data/lib/bitbucket_rest_api/connection.rb +97 -0
  10. data/lib/bitbucket_rest_api/constants.rb +58 -0
  11. data/lib/bitbucket_rest_api/core_ext/array.rb +17 -0
  12. data/lib/bitbucket_rest_api/core_ext/hash.rb +56 -0
  13. data/lib/bitbucket_rest_api/core_ext/ordered_hash.rb +107 -0
  14. data/lib/bitbucket_rest_api/deprecation.rb +39 -0
  15. data/lib/bitbucket_rest_api/error/bad_request.rb +12 -0
  16. data/lib/bitbucket_rest_api/error/client_error.rb +20 -0
  17. data/lib/bitbucket_rest_api/error/forbidden.rb +12 -0
  18. data/lib/bitbucket_rest_api/error/internal_server_error.rb +12 -0
  19. data/lib/bitbucket_rest_api/error/invalid_options.rb +18 -0
  20. data/lib/bitbucket_rest_api/error/not_found.rb +12 -0
  21. data/lib/bitbucket_rest_api/error/required_params.rb +18 -0
  22. data/lib/bitbucket_rest_api/error/service_error.rb +19 -0
  23. data/lib/bitbucket_rest_api/error/service_unavailable.rb +12 -0
  24. data/lib/bitbucket_rest_api/error/unauthorized.rb +12 -0
  25. data/lib/bitbucket_rest_api/error/unknown_value.rb +18 -0
  26. data/lib/bitbucket_rest_api/error/unprocessable_entity.rb +12 -0
  27. data/lib/bitbucket_rest_api/error/validations.rb +18 -0
  28. data/lib/bitbucket_rest_api/error.rb +35 -0
  29. data/lib/bitbucket_rest_api/issues/comments.rb +118 -0
  30. data/lib/bitbucket_rest_api/issues/components.rb +106 -0
  31. data/lib/bitbucket_rest_api/issues/milestones.rb +107 -0
  32. data/lib/bitbucket_rest_api/issues.rb +201 -0
  33. data/lib/bitbucket_rest_api/normalizer.rb +27 -0
  34. data/lib/bitbucket_rest_api/parameter_filter.rb +32 -0
  35. data/lib/bitbucket_rest_api/repos/changesets.rb +54 -0
  36. data/lib/bitbucket_rest_api/repos/following.rb +39 -0
  37. data/lib/bitbucket_rest_api/repos/keys.rb +87 -0
  38. data/lib/bitbucket_rest_api/repos.rb +213 -0
  39. data/lib/bitbucket_rest_api/request/basic_auth.rb +31 -0
  40. data/lib/bitbucket_rest_api/request/jsonize.rb +46 -0
  41. data/lib/bitbucket_rest_api/request/oauth.rb +49 -0
  42. data/lib/bitbucket_rest_api/request.rb +67 -0
  43. data/lib/bitbucket_rest_api/response/helpers.rb +21 -0
  44. data/lib/bitbucket_rest_api/response/jsonize.rb +30 -0
  45. data/lib/bitbucket_rest_api/response/mashify.rb +24 -0
  46. data/lib/bitbucket_rest_api/response/raise_error.rb +31 -0
  47. data/lib/bitbucket_rest_api/response/xmlize.rb +26 -0
  48. data/lib/bitbucket_rest_api/response.rb +28 -0
  49. data/lib/bitbucket_rest_api/result.rb +140 -0
  50. data/lib/bitbucket_rest_api/utils/url.rb +56 -0
  51. data/lib/bitbucket_rest_api/validations/format.rb +24 -0
  52. data/lib/bitbucket_rest_api/validations/presence.rb +25 -0
  53. data/lib/bitbucket_rest_api/validations/required.rb +24 -0
  54. data/lib/bitbucket_rest_api/validations/token.rb +43 -0
  55. data/lib/bitbucket_rest_api/validations.rb +25 -0
  56. data/lib/bitbucket_rest_api/version.rb +11 -0
  57. data/lib/bitbucket_rest_api.rb +87 -0
  58. 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