gitlab-akerl 4.0.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 (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