Skip to content

Commit c205185

Browse files
rashmi-rathidmgarland
authored andcommitted
Implement endpoints for webhooks
Add method to create webhooks Add a console adding BitBucket::Error::BadEvents class adding POST and GET to ../hooks adding BitBucket::Error::NoEvents class improving accuracy of spec messages adding #get and #edit for webhooks 1. refactoring webhooks_spec to fit inside ruler 2. included error handling when no events given adding delete endpoint for webhooks tidying up BitBucket::Repos::Webhooks class adding blank value error adding blank value error adding method to validate presence of required fields in body changing symbol to string string keys and only validating string fields validating presence of required keys and values for create and edit webhooks moving code inside the 80c ruler drying up mock params into let statements removing uneccessary newline
1 parent 0f1100a commit c205185

File tree

15 files changed

+476
-1
lines changed

15 files changed

+476
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ features/settings.yml
1414
TAGS
1515
.tags_sorted_by_file
1616
coverage
17+
.rspec

.rspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
--color
1+
--color -fd

bin/console

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/env ruby
2+
require 'bundler/setup'
3+
require 'bitbucket_rest_api'
4+
5+
require 'pry'
6+
Pry.start

lib/bitbucket_rest_api/error.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ def initialize(message)
3030
invalid_options
3131
required_params
3232
unknown_value
33+
bad_events
34+
no_events
35+
blank_value
3336
].each do |error|
3437
require "bitbucket_rest_api/error/#{error}"
3538
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module BitBucket
2+
module Error
3+
class BadEvents < ClientError
4+
def initialize(event)
5+
super "The event: '#{event}', does not exist :("
6+
end
7+
end
8+
end
9+
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module BitBucket
2+
module Error
3+
class BlankValue < ClientError
4+
def initialize(required_key)
5+
super "The value for: '#{required_key}', cannot be blank :("
6+
end
7+
end
8+
end
9+
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module BitBucket
2+
module Error
3+
class NoEvents < ClientError
4+
def initialize
5+
super "At least one event is required, none given :("
6+
end
7+
end
8+
end
9+
end

lib/bitbucket_rest_api/repos.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class Repos < API
1414
:Forks => 'forks',
1515
:Commits =>'commits',
1616
:Download=>'download',
17+
:Webhooks => 'webhooks',
1718
:PullRequest => 'pull_request'
1819

1920
DEFAULT_REPO_OPTIONS = {
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
module BitBucket
2+
class Repos::Webhooks < API
3+
EVENTS = [
4+
'repo:push',
5+
'repo:fork',
6+
'repo:commit_comment_created',
7+
'repo:commit_status_created',
8+
'repo:commit_status_updated',
9+
'issue:created',
10+
'issue:updated',
11+
'issue:comment_created',
12+
'pullrequest:created',
13+
'pullrequest:updated',
14+
'pullrequest:approved',
15+
'pullrequest:unapproved',
16+
'pullrequest:fulfilled',
17+
'pullrequest:rejected',
18+
'pullrequest:comment_created',
19+
'pullrequest:comment_updated',
20+
'pullrequest:comment_deleted'
21+
]
22+
23+
def create(user_name, repo_name, params = {})
24+
_update_user_repo_params(user_name, repo_name)
25+
_validate_user_repo_params(user, repo) unless user? && repo?
26+
normalize! params
27+
assert_required_keys(%w[description url active events], params)
28+
_validate_given_events(params)
29+
assert_required_values_present(
30+
params,
31+
'description',
32+
'url',
33+
'active',
34+
'events'
35+
)
36+
37+
post_request("2.0/repositories/#{user_name}/#{repo_name}/hooks", params)
38+
end
39+
40+
def list(user_name, repo_name)
41+
_update_user_repo_params(user_name, repo_name)
42+
_validate_user_repo_params(user, repo) unless user? && repo?
43+
44+
get_request("2.0/repositories/#{user_name}/#{repo_name}/hooks")
45+
end
46+
47+
def get(user_name, repo_name, hook_uuid)
48+
_update_user_repo_params(user_name, repo_name)
49+
_validate_user_repo_params(user, repo) unless user? && repo?
50+
51+
get_request(
52+
"2.0/repositories/#{user_name}/#{repo_name}/hooks/#{hook_uuid}"
53+
)
54+
end
55+
56+
def edit(user_name, repo_name, hook_uuid, params = {})
57+
_update_user_repo_params(user_name, repo_name)
58+
_validate_user_repo_params(user, repo) unless user? && repo?
59+
normalize! params
60+
assert_required_keys(%w[description url active events], params)
61+
_validate_given_events(params)
62+
assert_required_values_present(
63+
params,
64+
'description',
65+
'url',
66+
'active',
67+
'events'
68+
)
69+
70+
put_request(
71+
"2.0/repositories/#{user_name}/#{repo_name}/hooks/#{hook_uuid}",
72+
params
73+
)
74+
end
75+
76+
def delete(user_name, repo_name, hook_uuid)
77+
_update_user_repo_params(user_name, repo_name)
78+
_validate_user_repo_params(user, repo) unless user? && repo?
79+
80+
delete_request(
81+
"2.0/repositories/#{user_name}/#{repo_name}/hooks/#{hook_uuid}"
82+
)
83+
end
84+
85+
private
86+
def _validate_given_events(params)
87+
given_events = params['events']
88+
raise BitBucket::Error::NoEvents if given_events.empty?
89+
given_events.each do |k|
90+
unless EVENTS.include?(k)
91+
raise BitBucket::Error::BadEvents, k
92+
end
93+
end
94+
end
95+
end
96+
end

lib/bitbucket_rest_api/validations/required.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,26 @@ def assert_required_keys(required, provided)
1919
result
2020
end
2121

22+
# Validate that required values are not blank
23+
# the *required are colon separated strings
24+
# e.g. 'source:branch:name' tests value of params[:source][:branch][:name]
25+
#
26+
def assert_required_values_present(params, *required)
27+
required.each do |encoded_string|
28+
keys = parse_values(encoded_string)
29+
value = keys.inject(params) { |params, key| params[key] }
30+
if value.is_a?(String)
31+
if value.empty?
32+
raise BitBucket::Error::BlankValue.new(encoded_string)
33+
end
34+
end
35+
end
36+
end
37+
38+
def parse_values(string)
39+
string.split(':')
40+
end
41+
2242
end # Required
2343
end # Validations
2444
end # BitBucket

0 commit comments

Comments
 (0)