bitbucket_rest_api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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