gitlab-akerl 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (201) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.prospectus +11 -0
  4. data/.travis.yml +8 -0
  5. data/CHANGELOG.md +229 -0
  6. data/CONTRIBUTING.md +195 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +24 -0
  9. data/README.md +192 -0
  10. data/Rakefile +9 -0
  11. data/bin/console +10 -0
  12. data/bin/setup +6 -0
  13. data/exe/gitlab +7 -0
  14. data/gitlab-akerl.gemspec +31 -0
  15. data/lib/gitlab.rb +45 -0
  16. data/lib/gitlab/api.rb +19 -0
  17. data/lib/gitlab/cli.rb +89 -0
  18. data/lib/gitlab/cli_helpers.rb +241 -0
  19. data/lib/gitlab/client.rb +48 -0
  20. data/lib/gitlab/client/branches.rb +91 -0
  21. data/lib/gitlab/client/build_triggers.rb +51 -0
  22. data/lib/gitlab/client/build_variables.rb +66 -0
  23. data/lib/gitlab/client/builds.rb +106 -0
  24. data/lib/gitlab/client/commits.rb +121 -0
  25. data/lib/gitlab/client/groups.rb +144 -0
  26. data/lib/gitlab/client/issues.rb +113 -0
  27. data/lib/gitlab/client/labels.rb +57 -0
  28. data/lib/gitlab/client/merge_requests.rb +168 -0
  29. data/lib/gitlab/client/milestones.rb +78 -0
  30. data/lib/gitlab/client/namespaces.rb +20 -0
  31. data/lib/gitlab/client/notes.rb +161 -0
  32. data/lib/gitlab/client/pipelines.rb +68 -0
  33. data/lib/gitlab/client/projects.rb +471 -0
  34. data/lib/gitlab/client/repositories.rb +78 -0
  35. data/lib/gitlab/client/repository_files.rb +88 -0
  36. data/lib/gitlab/client/runners.rb +115 -0
  37. data/lib/gitlab/client/services.rb +50 -0
  38. data/lib/gitlab/client/snippets.rb +91 -0
  39. data/lib/gitlab/client/system_hooks.rb +59 -0
  40. data/lib/gitlab/client/tags.rb +96 -0
  41. data/lib/gitlab/client/users.rb +250 -0
  42. data/lib/gitlab/configuration.rb +55 -0
  43. data/lib/gitlab/error.rb +85 -0
  44. data/lib/gitlab/file_response.rb +46 -0
  45. data/lib/gitlab/help.rb +95 -0
  46. data/lib/gitlab/objectified_hash.rb +34 -0
  47. data/lib/gitlab/page_links.rb +33 -0
  48. data/lib/gitlab/paginated_response.rb +97 -0
  49. data/lib/gitlab/request.rb +117 -0
  50. data/lib/gitlab/shell.rb +84 -0
  51. data/lib/gitlab/shell_history.rb +59 -0
  52. data/lib/gitlab/version.rb +3 -0
  53. data/spec/fixtures/branch.json +1 -0
  54. data/spec/fixtures/branch_delete.json +3 -0
  55. data/spec/fixtures/branches.json +1 -0
  56. data/spec/fixtures/build.json +38 -0
  57. data/spec/fixtures/build_artifacts.json +0 -0
  58. data/spec/fixtures/build_cancel.json +24 -0
  59. data/spec/fixtures/build_erase.json +24 -0
  60. data/spec/fixtures/build_retry.json +24 -0
  61. data/spec/fixtures/builds.json +78 -0
  62. data/spec/fixtures/builds_commits.json +64 -0
  63. data/spec/fixtures/compare_merge_request_diff.json +31 -0
  64. data/spec/fixtures/error_already_exists.json +1 -0
  65. data/spec/fixtures/error_project_not_found.json +1 -0
  66. data/spec/fixtures/get_repository_file.json +1 -0
  67. data/spec/fixtures/git_hook.json +1 -0
  68. data/spec/fixtures/group.json +60 -0
  69. data/spec/fixtures/group_create.json +1 -0
  70. data/spec/fixtures/group_create_with_description.json +1 -0
  71. data/spec/fixtures/group_delete.json +1 -0
  72. data/spec/fixtures/group_member.json +1 -0
  73. data/spec/fixtures/group_member_delete.json +1 -0
  74. data/spec/fixtures/group_member_edit.json +1 -0
  75. data/spec/fixtures/group_members.json +1 -0
  76. data/spec/fixtures/group_projects.json +44 -0
  77. data/spec/fixtures/group_search.json +2 -0
  78. data/spec/fixtures/groups.json +2 -0
  79. data/spec/fixtures/issue.json +1 -0
  80. data/spec/fixtures/issues.json +1 -0
  81. data/spec/fixtures/key.json +1 -0
  82. data/spec/fixtures/keys.json +1 -0
  83. data/spec/fixtures/label.json +1 -0
  84. data/spec/fixtures/labels.json +1 -0
  85. data/spec/fixtures/merge_request.json +1 -0
  86. data/spec/fixtures/merge_request_changes.json +1 -0
  87. data/spec/fixtures/merge_request_comment.json +1 -0
  88. data/spec/fixtures/merge_request_comments.json +1 -0
  89. data/spec/fixtures/merge_request_commits.json +1 -0
  90. data/spec/fixtures/merge_requests.json +1 -0
  91. data/spec/fixtures/milestone.json +1 -0
  92. data/spec/fixtures/milestone_issues.json +1 -0
  93. data/spec/fixtures/milestones.json +1 -0
  94. data/spec/fixtures/namespaces.json +1 -0
  95. data/spec/fixtures/note.json +1 -0
  96. data/spec/fixtures/notes.json +1 -0
  97. data/spec/fixtures/pipeline.json +23 -0
  98. data/spec/fixtures/pipeline_cancel.json +23 -0
  99. data/spec/fixtures/pipeline_create.json +23 -0
  100. data/spec/fixtures/pipeline_retry.json +23 -0
  101. data/spec/fixtures/pipelines.json +48 -0
  102. data/spec/fixtures/project.json +1 -0
  103. data/spec/fixtures/project_commit.json +13 -0
  104. data/spec/fixtures/project_commit_comment.json +1 -0
  105. data/spec/fixtures/project_commit_comments.json +1 -0
  106. data/spec/fixtures/project_commit_diff.json +10 -0
  107. data/spec/fixtures/project_commit_status.json +42 -0
  108. data/spec/fixtures/project_commits.json +1 -0
  109. data/spec/fixtures/project_edit.json +21 -0
  110. data/spec/fixtures/project_events.json +1 -0
  111. data/spec/fixtures/project_for_user.json +1 -0
  112. data/spec/fixtures/project_fork.json +50 -0
  113. data/spec/fixtures/project_fork_link.json +1 -0
  114. data/spec/fixtures/project_forked_for_user.json +50 -0
  115. data/spec/fixtures/project_hook.json +1 -0
  116. data/spec/fixtures/project_hooks.json +1 -0
  117. data/spec/fixtures/project_issues.json +1 -0
  118. data/spec/fixtures/project_key.json +6 -0
  119. data/spec/fixtures/project_keys.json +6 -0
  120. data/spec/fixtures/project_runner_enable.json +7 -0
  121. data/spec/fixtures/project_runners.json +16 -0
  122. data/spec/fixtures/project_search.json +1 -0
  123. data/spec/fixtures/project_star.json +44 -0
  124. data/spec/fixtures/project_tag_annotated.json +1 -0
  125. data/spec/fixtures/project_tag_lightweight.json +1 -0
  126. data/spec/fixtures/project_tags.json +1 -0
  127. data/spec/fixtures/project_unstar.json +44 -0
  128. data/spec/fixtures/project_update_commit_status.json +20 -0
  129. data/spec/fixtures/projects.json +1 -0
  130. data/spec/fixtures/raw_file.json +2 -0
  131. data/spec/fixtures/release_create.json +1 -0
  132. data/spec/fixtures/release_update.json +1 -0
  133. data/spec/fixtures/repository_file.json +1 -0
  134. data/spec/fixtures/runner.json +26 -0
  135. data/spec/fixtures/runner_delete.json +7 -0
  136. data/spec/fixtures/runner_edit.json +26 -0
  137. data/spec/fixtures/runners.json +16 -0
  138. data/spec/fixtures/runners_all.json +30 -0
  139. data/spec/fixtures/service.json +1 -0
  140. data/spec/fixtures/session.json +1 -0
  141. data/spec/fixtures/shell_history.json +2 -0
  142. data/spec/fixtures/snippet.json +1 -0
  143. data/spec/fixtures/snippet_content.json +3 -0
  144. data/spec/fixtures/snippets.json +1 -0
  145. data/spec/fixtures/system_hook.json +1 -0
  146. data/spec/fixtures/system_hooks.json +1 -0
  147. data/spec/fixtures/tag.json +1 -0
  148. data/spec/fixtures/tag_create.json +1 -0
  149. data/spec/fixtures/tag_create_with_description.json +1 -0
  150. data/spec/fixtures/tag_delete.json +1 -0
  151. data/spec/fixtures/tags.json +1 -0
  152. data/spec/fixtures/team_member.json +1 -0
  153. data/spec/fixtures/team_members.json +1 -0
  154. data/spec/fixtures/tree.json +1 -0
  155. data/spec/fixtures/trigger.json +7 -0
  156. data/spec/fixtures/triggers.json +16 -0
  157. data/spec/fixtures/user.json +1 -0
  158. data/spec/fixtures/user_block_unblock.json +1 -0
  159. data/spec/fixtures/user_email.json +1 -0
  160. data/spec/fixtures/user_emails.json +1 -0
  161. data/spec/fixtures/user_search.json +1 -0
  162. data/spec/fixtures/users.json +1 -0
  163. data/spec/fixtures/variable.json +4 -0
  164. data/spec/fixtures/variables.json +10 -0
  165. data/spec/gitlab/cli_helpers_spec.rb +57 -0
  166. data/spec/gitlab/cli_spec.rb +110 -0
  167. data/spec/gitlab/client/branches_spec.rb +99 -0
  168. data/spec/gitlab/client/build_triggers_spec.rb +67 -0
  169. data/spec/gitlab/client/build_variables_spec.rb +86 -0
  170. data/spec/gitlab/client/builds_spec.rb +148 -0
  171. data/spec/gitlab/client/client_spec.rb +11 -0
  172. data/spec/gitlab/client/commits_spec.rb +137 -0
  173. data/spec/gitlab/client/groups_spec.rb +197 -0
  174. data/spec/gitlab/client/issues_spec.rb +138 -0
  175. data/spec/gitlab/client/labels_spec.rb +68 -0
  176. data/spec/gitlab/client/merge_requests_spec.rb +177 -0
  177. data/spec/gitlab/client/milestones_spec.rb +82 -0
  178. data/spec/gitlab/client/namespaces_spec.rb +22 -0
  179. data/spec/gitlab/client/notes_spec.rb +205 -0
  180. data/spec/gitlab/client/pipelines_spec.rb +95 -0
  181. data/spec/gitlab/client/projects_spec.rb +603 -0
  182. data/spec/gitlab/client/repositories_spec.rb +109 -0
  183. data/spec/gitlab/client/repository_files_spec.rb +62 -0
  184. data/spec/gitlab/client/runners_spec.rb +185 -0
  185. data/spec/gitlab/client/services_spec.rb +55 -0
  186. data/spec/gitlab/client/snippets_spec.rb +100 -0
  187. data/spec/gitlab/client/system_hooks_spec.rb +69 -0
  188. data/spec/gitlab/client/tags_spec.rb +109 -0
  189. data/spec/gitlab/client/users_spec.rb +418 -0
  190. data/spec/gitlab/error_spec.rb +45 -0
  191. data/spec/gitlab/file_response_spec.rb +33 -0
  192. data/spec/gitlab/help_spec.rb +46 -0
  193. data/spec/gitlab/objectified_hash_spec.rb +48 -0
  194. data/spec/gitlab/page_links_spec.rb +16 -0
  195. data/spec/gitlab/paginated_response_spec.rb +60 -0
  196. data/spec/gitlab/request_spec.rb +73 -0
  197. data/spec/gitlab/shell_history_spec.rb +53 -0
  198. data/spec/gitlab/shell_spec.rb +80 -0
  199. data/spec/gitlab_spec.rb +97 -0
  200. data/spec/spec_helper.rb +74 -0
  201. metadata +476 -0
@@ -0,0 +1,96 @@
1
+ class Gitlab::Client
2
+ # Defines methods related to tags.
3
+ # @see https://docs.gitlab.com/ce/api/tags.html
4
+ module Tags
5
+ # Gets a list of project repository tags.
6
+ #
7
+ # @example
8
+ # Gitlab.tags(42)
9
+ #
10
+ # @param [Integer] project The ID of a project.
11
+ # @param [Hash] options A customizable set of options.
12
+ # @option options [Integer] :page The page number.
13
+ # @option options [Integer] :per_page The number of results per page.
14
+ # @return [Array<Gitlab::ObjectifiedHash>]
15
+ def tags(project, options={})
16
+ get("/projects/#{project}/repository/tags", query: options)
17
+ end
18
+ alias_method :repo_tags, :tags
19
+
20
+ # Creates a new project repository tag.
21
+ #
22
+ # @example
23
+ # Gitlab.create_tag(42, 'new_tag', 'master')
24
+ # Gitlab.create_tag(42, 'v1.0', 'master', 'Release 1.0')
25
+ #
26
+ # @param [Integer] project The ID of a project.
27
+ # @param [String] tag_name The name of the new tag.
28
+ # @param [String] ref The ref (commit sha, branch name, or another tag) the tag will point to.
29
+ # @param [String] message Optional message for tag, creates annotated tag if specified.
30
+ # @param [String] description Optional release notes for tag.
31
+ # @return [Gitlab::ObjectifiedHash]
32
+ def create_tag(project, tag_name, ref, message='', description=nil)
33
+ post("/projects/#{project}/repository/tags", body: { tag_name: tag_name, ref: ref, message: message, description: description })
34
+ end
35
+ alias_method :repo_create_tag, :create_tag
36
+
37
+ # Gets information about a repository tag.
38
+ #
39
+ # @example
40
+ # Gitlab.tag(3, 'api')
41
+ # Gitlab.repo_tag(5, 'master')
42
+ #
43
+ # @param [Integer] project The ID of a project.
44
+ # @param [String] tag The name of the tag.
45
+ # @return [Gitlab::ObjectifiedHash]
46
+ def tag(project, tag)
47
+ get("/projects/#{project}/repository/tags/#{tag}")
48
+ end
49
+ alias_method :repo_tag, :tag
50
+
51
+ # Deletes a repository tag. Requires Gitlab >= 6.8.x
52
+ #
53
+ # @example
54
+ # Gitlab.delete_tag(3, 'api')
55
+ # Gitlab.repo_delete_tag(5, 'master')
56
+ #
57
+ # @param [Integer] project The ID of a project.
58
+ # @param [String] tag The name of the tag to delete
59
+ # @return [Gitlab::ObjectifiedHash]
60
+ def delete_tag(project, tag)
61
+ delete("/projects/#{project}/repository/tags/#{tag}")
62
+ end
63
+ alias_method :repo_delete_tag, :delete_tag
64
+
65
+ # Adds release notes to an existing repository tag. Requires Gitlab >= 8.2.0
66
+ #
67
+ # @example
68
+ # Gitlab.create_release(3, '1.0.0', 'This is ready for production')
69
+ # Gitlab.repo_create_release(5, '1.0.0', 'This is ready for production')
70
+ #
71
+ # @param [Integer] project The ID of a project.
72
+ # @param [String] tag The name of the new tag.
73
+ # @param [String] description Release notes with markdown support
74
+ # @return [Gitlab::ObjectifiedHash]
75
+ def create_release(project, tag, description)
76
+ post("/projects/#{project}/repository/tags/#{tag}/release", body: { description: description })
77
+ end
78
+ alias_method :repo_create_release, :create_release
79
+
80
+ # Updates the release notes of a given release. Requires Gitlab >= 8.2.0
81
+ #
82
+ # @example
83
+ # Gitlab.update_release(3, '1.0.0', 'This is even more ready for production')
84
+ # Gitlab.repo_update_release(5, '1.0.0', 'This is even more ready for production')
85
+ #
86
+ # @param [Integer] project The ID of a project.
87
+ # @param [String] tag The name of the new tag.
88
+ # @param [String] description Release notes with markdown support
89
+ # @return [Gitlab::ObjectifiedHash]
90
+ def update_release(project, tag, description)
91
+ put("/projects/#{project}/repository/tags/#{tag}/release", body: { description: description })
92
+ end
93
+ alias_method :repo_update_release, :update_release
94
+
95
+ end
96
+ end
@@ -0,0 +1,250 @@
1
+ class Gitlab::Client
2
+ # Defines methods related to users.
3
+ # @see https://docs.gitlab.com/ce/api/users.html
4
+ # @see https://docs.gitlab.com/ce/api/session.html
5
+ module Users
6
+ # Gets a list of users.
7
+ #
8
+ # @example
9
+ # Gitlab.users
10
+ #
11
+ # @param [Hash] options A customizable set of options.
12
+ # @option options [Integer] :page The page number.
13
+ # @option options [Integer] :per_page The number of results per page.
14
+ # @return [Array<Gitlab::ObjectifiedHash>]
15
+ def users(options={})
16
+ get("/users", query: options)
17
+ end
18
+
19
+ # Gets information about a user.
20
+ # Will return information about an authorized user if no ID passed.
21
+ #
22
+ # @example
23
+ # Gitlab.user
24
+ # Gitlab.user(2)
25
+ #
26
+ # @param [Integer] id The ID of a user.
27
+ # @return [Gitlab::ObjectifiedHash]
28
+ def user(id=nil)
29
+ id.to_i.zero? ? get("/user") : get("/users/#{id}")
30
+ end
31
+
32
+ # Creates a new user.
33
+ # Requires authentication from an admin account.
34
+ #
35
+ # @example
36
+ # Gitlab.create_user('joe@foo.org', 'secret', 'joe', { name: 'Joe Smith' })
37
+ # or
38
+ # Gitlab.create_user('joe@foo.org', 'secret')
39
+ #
40
+ # @param [String] email The email of a user.
41
+ # @param [String] password The password of a user.
42
+ # @param [String] username The username of a user.
43
+ # @param [Hash] options A customizable set of options.
44
+ # @option options [String] :name The name of a user. Defaults to email.
45
+ # @option options [String] :skype The skype of a user.
46
+ # @option options [String] :linkedin The linkedin of a user.
47
+ # @option options [String] :twitter The twitter of a user.
48
+ # @option options [Integer] :projects_limit The limit of projects for a user.
49
+ # @return [Gitlab::ObjectifiedHash] Information about created user.
50
+ def create_user(*args)
51
+ options = Hash === args.last ? args.pop : {}
52
+ if args[2]
53
+ body = { email: args[0], password: args[1], username: args[2] }
54
+ else
55
+ body = { email: args[0], password: args[1], name: args[0] }
56
+ end
57
+ body.merge!(options)
58
+ post('/users', body: body)
59
+ end
60
+
61
+ # Updates a user.
62
+ #
63
+ # @example
64
+ # Gitlab.edit_user(15, { email: 'joe.smith@foo.org', projects_limit: 20 })
65
+ #
66
+ # @param [Integer] id The ID of a user.
67
+ # @param [Hash] options A customizable set of options.
68
+ # @option options [String] :email The email of a user.
69
+ # @option options [String] :password The password of a user.
70
+ # @option options [String] :name The name of a user. Defaults to email.
71
+ # @option options [String] :skype The skype of a user.
72
+ # @option options [String] :linkedin The linkedin of a user.
73
+ # @option options [String] :twitter The twitter of a user.
74
+ # @option options [Integer] :projects_limit The limit of projects for a user.
75
+ # @return [Gitlab::ObjectifiedHash] Information about created user.
76
+ def edit_user(user_id, options={})
77
+ put("/users/#{user_id}", body: options)
78
+ end
79
+
80
+ # Deletes a user.
81
+ #
82
+ # @example
83
+ # Gitlab.delete_user(1)
84
+ #
85
+ # @param [Integer] id The ID of a user.
86
+ # @return [Gitlab::ObjectifiedHash] Information about deleted user.
87
+ def delete_user(user_id)
88
+ delete("/users/#{user_id}")
89
+ end
90
+
91
+ # Blocks the specified user. Available only for admin.
92
+ #
93
+ # @example
94
+ # Gitlab.block_user(15)
95
+ #
96
+ # @param [Integer] user_id The Id of user
97
+ # @return [Boolean] success or not
98
+ def block_user(user_id)
99
+ put("/users/#{user_id}/block")
100
+ end
101
+
102
+ # Unblocks the specified user. Available only for admin.
103
+ #
104
+ # @example
105
+ # Gitlab.unblock_user(15)
106
+ #
107
+ # @param [Integer] user_id The Id of user
108
+ # @return [Boolean] success or not
109
+ def unblock_user(user_id)
110
+ put("/users/#{user_id}/unblock")
111
+ end
112
+
113
+ # Creates a new user session.
114
+ #
115
+ # @example
116
+ # Gitlab.session('jack@example.com', 'secret12345')
117
+ #
118
+ # @param [String] email The email of a user.
119
+ # @param [String] password The password of a user.
120
+ # @return [Gitlab::ObjectifiedHash]
121
+ # @note This method doesn't require private_token to be set.
122
+ def session(email, password)
123
+ post("/session", body: { email: email, password: password })
124
+ end
125
+
126
+ # Gets a list of user's SSH keys.
127
+ #
128
+ # @example
129
+ # Gitlab.ssh_keys
130
+ # Gitlab.ssh_keys({ user_id: 2 })
131
+ #
132
+ # @param [Hash] options A customizable set of options.
133
+ # @option options [Integer] :page The page number.
134
+ # @option options [Integer] :per_page The number of results per page.
135
+ # @option options [Integer] :user_id The ID of the user to retrieve the keys for.
136
+ # @return [Array<Gitlab::ObjectifiedHash>]
137
+ def ssh_keys(options={})
138
+ user_id = options.delete :user_id
139
+ if user_id.to_i.zero?
140
+ get("/user/keys", query: options)
141
+ else
142
+ get("/users/#{user_id}/keys", query: options)
143
+ end
144
+ end
145
+
146
+ # Gets information about SSH key.
147
+ #
148
+ # @example
149
+ # Gitlab.ssh_key(1)
150
+ #
151
+ # @param [Integer] id The ID of a user's SSH key.
152
+ # @return [Gitlab::ObjectifiedHash]
153
+ def ssh_key(id)
154
+ get("/user/keys/#{id}")
155
+ end
156
+
157
+ # Creates a new SSH key.
158
+ #
159
+ # @example
160
+ # Gitlab.create_ssh_key('key title', 'key body')
161
+ #
162
+ # @param [String] title The title of an SSH key.
163
+ # @param [String] key The SSH key body.
164
+ # @return [Gitlab::ObjectifiedHash] Information about created SSH key.
165
+ def create_ssh_key(title, key)
166
+ post("/user/keys", body: { title: title, key: key })
167
+ end
168
+
169
+ # Deletes an SSH key.
170
+ #
171
+ # @example
172
+ # Gitlab.delete_ssh_key(1)
173
+ #
174
+ # @param [Integer] id The ID of a user's SSH key.
175
+ # @return [Gitlab::ObjectifiedHash] Information about deleted SSH key.
176
+ def delete_ssh_key(id)
177
+ delete("/user/keys/#{id}")
178
+ end
179
+
180
+ # Gets user emails.
181
+ # Will return emails an authorized user if no user ID passed.
182
+ #
183
+ # @example
184
+ # Gitlab.emails
185
+ # Gitlab.emails(2)
186
+ #
187
+ # @param [Integer] user_id The ID of a user.
188
+ # @return [Gitlab::ObjectifiedHash]
189
+ def emails(user_id=nil)
190
+ url = user_id.to_i.zero? ? "/user/emails" : "/users/#{user_id}/emails"
191
+ get(url)
192
+ end
193
+
194
+ # Get a single email.
195
+ #
196
+ # @example
197
+ # Gitlab.email(3)
198
+ #
199
+ # @param [Integer] id The ID of a email.
200
+ # @return [Gitlab::ObjectifiedHash]
201
+ def email(id)
202
+ get("/user/emails/#{id}")
203
+ end
204
+
205
+ # Creates a new email
206
+ # Will create a new email an authorized user if no user ID passed.
207
+ #
208
+ # @example
209
+ # Gitlab.add_email('email@example.com')
210
+ # Gitlab.add_email('email@example.com', 2)
211
+ #
212
+ # @param [String] email Email address
213
+ # @param [Integer] user_id The ID of a user.
214
+ # @return [Gitlab::ObjectifiedHash]
215
+ def add_email(email, user_id=nil)
216
+ url = user_id.to_i.zero? ? "/user/emails" : "/users/#{user_id}/emails"
217
+ post(url, body: {email: email})
218
+ end
219
+
220
+ # Delete email
221
+ # Will delete a email an authorized user if no user ID passed.
222
+ #
223
+ # @example
224
+ # Gitlab.delete_email(2)
225
+ # Gitlab.delete_email(3, 2)
226
+ #
227
+ # @param [Integer] id Email address ID
228
+ # @param [Integer] user_id The ID of a user.
229
+ # @return [Boolean]
230
+ def delete_email(id, user_id=nil)
231
+ url = user_id.to_i.zero? ? "/user/emails/#{id}" : "/users/#{user_id}/emails/#{id}"
232
+ delete(url)
233
+ end
234
+
235
+ # Search for groups by name
236
+ #
237
+ # @example
238
+ # Gitlab.user_search('gitlab')
239
+ #
240
+ # @param [String] search A string to search for in user names and paths.
241
+ # @param [Hash] options A customizable set of options.
242
+ # @option options [String] :per_page Number of user to return per page
243
+ # @option options [String] :page The page to retrieve
244
+ # @return [Array<Gitlab::ObjectifiedHash>]
245
+ def user_search(search, options={})
246
+ options[:search] = search
247
+ get("/users", query: options)
248
+ end
249
+ end
250
+ end
@@ -0,0 +1,55 @@
1
+ require 'gitlab/cli_helpers'
2
+ module Gitlab
3
+ # Defines constants and methods related to configuration.
4
+ module Configuration
5
+ # An array of valid keys in the options hash when configuring a Gitlab::API.
6
+ VALID_OPTIONS_KEYS = [:endpoint, :private_token, :user_agent, :sudo, :httparty].freeze
7
+
8
+ # The user agent that will be sent to the API endpoint if none is set.
9
+ DEFAULT_USER_AGENT = "Gitlab Ruby Gem #{Gitlab::VERSION}".freeze
10
+
11
+ # @private
12
+ attr_accessor(*VALID_OPTIONS_KEYS)
13
+ # @private
14
+ alias_method :auth_token=, :private_token=
15
+
16
+ # Sets all configuration options to their default values
17
+ # when this module is extended.
18
+ def self.extended(base)
19
+ base.reset
20
+ end
21
+
22
+ # Convenience method to allow configuration options to be set in a block.
23
+ def configure
24
+ yield self
25
+ end
26
+
27
+ # Creates a hash of options and their values.
28
+ def options
29
+ VALID_OPTIONS_KEYS.inject({}) do |option, key|
30
+ option.merge!(key => send(key))
31
+ end
32
+ end
33
+
34
+ # Resets all configuration options to the defaults.
35
+ def reset
36
+ self.endpoint = ENV['GITLAB_API_ENDPOINT']
37
+ self.private_token = ENV['GITLAB_API_PRIVATE_TOKEN'] || ENV['GITLAB_API_AUTH_TOKEN']
38
+ self.httparty = get_httparty_config(ENV['GITLAB_API_HTTPARTY_OPTIONS'])
39
+ self.sudo = nil
40
+ self.user_agent = DEFAULT_USER_AGENT
41
+ end
42
+
43
+ private
44
+
45
+ # Allows HTTParty config to be specified in ENV using YAML hash.
46
+ def get_httparty_config(options)
47
+ return options if options.nil?
48
+
49
+ httparty = Gitlab::CLI::Helpers.yaml_load(options)
50
+
51
+ raise ArgumentError, "HTTParty config should be a Hash." unless httparty.is_a? Hash
52
+ Gitlab::CLI::Helpers.symbolize_keys httparty
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,85 @@
1
+ module Gitlab
2
+ module Error
3
+ # Custom error class for rescuing from all Gitlab errors.
4
+ class Error < StandardError; end
5
+
6
+ # Raised when API endpoint credentials not configured.
7
+ class MissingCredentials < Error; end
8
+
9
+ # Raised when impossible to parse response body.
10
+ class Parsing < Error; end
11
+
12
+ # Custom error class for rescuing from HTTP response errors.
13
+ class ResponseError < Error
14
+ def initialize(response)
15
+ @response = response
16
+ super(build_error_message)
17
+ end
18
+
19
+ # Status code returned in the http response.
20
+ #
21
+ # @return [Integer]
22
+ def response_status
23
+ @response.code
24
+ end
25
+
26
+ private
27
+
28
+ # Human friendly message.
29
+ #
30
+ # @return [String]
31
+ def build_error_message
32
+ parsed_response = @response.parsed_response
33
+ message = parsed_response.message || parsed_response.error
34
+
35
+ "Server responded with code #{@response.code}, message: " \
36
+ "#{handle_message(message)}. " \
37
+ "Request URI: #{@response.request.base_uri}#{@response.request.path}"
38
+ end
39
+
40
+ # Handle error response message in case of nested hashes
41
+ def handle_message(message)
42
+ case message
43
+ when Gitlab::ObjectifiedHash
44
+ message.to_h.sort.map do |key, val|
45
+ "'#{key}' #{(val.is_a?(Hash) ? val.sort.map { |k, v| "(#{k}: #{v.join(' ')})" } : val).join(' ')}"
46
+ end.join(', ')
47
+ when Array
48
+ message.join(' ')
49
+ else
50
+ message
51
+ end
52
+ end
53
+ end
54
+
55
+ # Raised when API endpoint returns the HTTP status code 400.
56
+ class BadRequest < ResponseError; end
57
+
58
+ # Raised when API endpoint returns the HTTP status code 401.
59
+ class Unauthorized < ResponseError; end
60
+
61
+ # Raised when API endpoint returns the HTTP status code 403.
62
+ class Forbidden < ResponseError; end
63
+
64
+ # Raised when API endpoint returns the HTTP status code 404.
65
+ class NotFound < ResponseError; end
66
+
67
+ # Raised when API endpoint returns the HTTP status code 405.
68
+ class MethodNotAllowed < ResponseError; end
69
+
70
+ # Raised when API endpoint returns the HTTP status code 409.
71
+ class Conflict < ResponseError; end
72
+
73
+ # Raised when API endpoint returns the HTTP status code 422.
74
+ class Unprocessable < ResponseError; end
75
+
76
+ # Raised when API endpoint returns the HTTP status code 500.
77
+ class InternalServerError < ResponseError; end
78
+
79
+ # Raised when API endpoint returns the HTTP status code 502.
80
+ class BadGateway < ResponseError; end
81
+
82
+ # Raised when API endpoint returns the HTTP status code 503.
83
+ class ServiceUnavailable < ResponseError; end
84
+ end
85
+ end