pact_broker 2.12.0 → 2.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +42 -5
- data/README.md +13 -8
- data/bethtest.rb +21 -94
- data/db/migrations/20171112_add_test_results.rb +7 -0
- data/db/migrations/20171117_create_webhook_events.rb +14 -0
- data/db/migrations/20171118_create_webhook_events.rb +18 -0
- data/db/migrations/20180108_create_certificates_table.rb +14 -0
- data/db/migrations/20180109_migrate_trigger_type.rb +9 -0
- data/db/pact_broker_database.sqlite3 +0 -0
- data/db/test/backwards_compatibility/gemfiles/1.18.0.gemfile.lock +5 -5
- data/db/test/backwards_compatibility/gemfiles/2.0.0.gemfile.lock +5 -5
- data/db/test/backwards_compatibility/gemfiles/2.1.0.gemfile.lock +5 -5
- data/db/test/backwards_compatibility/gemfiles/2.2.0.gemfile.lock +12 -14
- data/db/test/backwards_compatibility/gemfiles/2.3.0.gemfile.lock +12 -14
- data/db/test/backwards_compatibility/gemfiles/2.4.2.gemfile.lock +12 -14
- data/db/test/backwards_compatibility/gemfiles/2.5.1.gemfile.lock +12 -14
- data/db/test/backwards_compatibility/gemfiles/2.6.0.gemfile.lock +12 -14
- data/db/test/backwards_compatibility/gemfiles/head.gemfile.lock +16 -15
- data/db/test/change_migration_strategy/before/Gemfile +1 -0
- data/example/README.md +65 -0
- data/example/config.ru +1 -0
- data/example/example_data.sql +17 -0
- data/lib/pact_broker/api.rb +1 -1
- data/lib/pact_broker/api/contracts/webhook_contract.rb +9 -1
- data/lib/pact_broker/api/decorators/verification_decorator.rb +1 -0
- data/lib/pact_broker/api/decorators/webhook_decorator.rb +35 -5
- data/lib/pact_broker/api/resources/matrix_badge.rb +21 -0
- data/lib/pact_broker/certificates/certificate.rb +8 -0
- data/lib/pact_broker/certificates/service.rb +41 -0
- data/lib/pact_broker/doc/controllers/app.rb +12 -2
- data/lib/pact_broker/doc/views/webhooks.markdown +37 -2
- data/lib/pact_broker/domain/verification.rb +2 -0
- data/lib/pact_broker/domain/webhook.rb +2 -1
- data/lib/pact_broker/domain/webhook_request.rb +22 -4
- data/lib/pact_broker/error.rb +5 -0
- data/lib/pact_broker/matrix/parse_query.rb +7 -10
- data/lib/pact_broker/matrix/repository.rb +5 -32
- data/lib/pact_broker/matrix/service.rb +21 -3
- data/lib/pact_broker/pacts/repository.rb +9 -2
- data/lib/pact_broker/pacts/service.rb +2 -2
- data/lib/pact_broker/services.rb +5 -0
- data/lib/pact_broker/ui/app.rb +15 -0
- data/lib/pact_broker/ui/controllers/matrix.rb +58 -3
- data/lib/pact_broker/ui/views/matrix/show.haml +65 -10
- data/lib/pact_broker/verifications/service.rb +6 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/webhooks/job.rb +1 -1
- data/lib/pact_broker/webhooks/repository.rb +17 -0
- data/lib/pact_broker/webhooks/service.rb +8 -7
- data/lib/pact_broker/webhooks/triggered_webhook.rb +1 -1
- data/lib/pact_broker/webhooks/webhook.rb +3 -0
- data/lib/pact_broker/webhooks/webhook_event.rb +24 -0
- data/pact_broker.gemspec +2 -1
- data/public/javascripts/matrix.js +60 -0
- data/public/stylesheets/matrix.css +12 -0
- data/script/db-spec.sh +1 -0
- data/script/foo-bar-verification.json +57 -0
- data/script/insert-self-signed-certificate-from-url.rb +32 -0
- data/script/publish-verification.sh +5 -0
- data/script/seed-matrix.rb +6 -5
- data/script/seed.rb +67 -59
- data/spec/features/create_webhook_spec.rb +4 -1
- data/spec/features/get_matrix_badge_spec.rb +40 -0
- data/spec/features/publish_verification_spec.rb +28 -4
- data/spec/fixtures/certificate-invalid.pem +29 -0
- data/spec/fixtures/certificate.pem +53 -0
- data/spec/fixtures/certificates/cacert.pem +21 -0
- data/spec/fixtures/certificates/cert.pem +20 -0
- data/spec/fixtures/certificates/key.pem +27 -0
- data/spec/fixtures/certificates/self-signed.badssl.com.pem +21 -0
- data/spec/fixtures/verification.json +4 -1
- data/spec/fixtures/webhook_valid.json +3 -0
- data/spec/integration/webhooks/certificate_spec.rb +80 -0
- data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +20 -0
- data/spec/lib/pact_broker/api/decorators/pact_webhooks_status_decorator_spec.rb +2 -2
- data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +5 -0
- data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +1 -0
- data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +29 -19
- data/spec/lib/pact_broker/api/resources/badge_spec.rb +61 -0
- data/spec/lib/pact_broker/api/resources/matrix_badge_spec.rb +11 -0
- data/spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb +8 -9
- data/spec/lib/pact_broker/certificates/service_spec.rb +60 -0
- data/spec/lib/pact_broker/domain/verification_spec.rb +13 -0
- data/spec/lib/pact_broker/domain/webhook_request_spec.rb +0 -4
- data/spec/lib/pact_broker/matrix/service_spec.rb +40 -8
- data/spec/lib/pact_broker/pacts/repository_spec.rb +18 -1
- data/spec/lib/pact_broker/webhooks/job_spec.rb +1 -1
- data/spec/lib/pact_broker/webhooks/repository_spec.rb +53 -13
- data/spec/lib/pact_broker/webhooks/service_spec.rb +9 -6
- data/spec/migrations/change_migration_strategy_spec.rb +13 -14
- data/spec/spec_helper.rb +4 -0
- data/spec/support/ssl_webhook_server.rb +37 -0
- data/spec/support/test_data_builder.rb +12 -4
- data/tasks/database.rb +9 -7
- data/tasks/database/table_dependency_calculator.rb +44 -0
- metadata +57 -6
- data/lib/pact_broker/doc/views/pact-webhooks.markdown +0 -50
- data/lib/pact_broker/doc/views/webhooks-create.markdown +0 -38
- data/lib/pact_broker/doc/views/webhooks-webhooks.markdown +0 -15
@@ -7,10 +7,10 @@ module PactBroker
|
|
7
7
|
params = Rack::Utils.parse_nested_query(query)
|
8
8
|
selectors = (params['q'] || []).collect do |i|
|
9
9
|
p = {}
|
10
|
-
p[:pacticipant_name] = i['pacticipant'] if i['pacticipant']
|
11
|
-
p[:pacticipant_version_number] = i['version'] if i['version']
|
10
|
+
p[:pacticipant_name] = i['pacticipant'] if i['pacticipant'] && i['pacticipant'] != ''
|
11
|
+
p[:pacticipant_version_number] = i['version'] if i['version'] && i['version'] != ''
|
12
12
|
p[:latest] = true if i['latest'] == 'true'
|
13
|
-
p[:tag] = i['tag'] if i['tag']
|
13
|
+
p[:tag] = i['tag'] if i['tag'] && i['tag'] != ''
|
14
14
|
p
|
15
15
|
end
|
16
16
|
options = {}
|
@@ -22,19 +22,16 @@ module PactBroker
|
|
22
22
|
if params.key?('success') && params['success'].is_a?(String)
|
23
23
|
options[:success] = [params['success'] == '' ? nil : params['success'] == 'true']
|
24
24
|
end
|
25
|
-
if params.key?('
|
26
|
-
options[:scope] = params['scope']
|
27
|
-
end
|
28
|
-
if params.key?('latestby')
|
25
|
+
if params.key?('latestby') && params['latestby'] != ''
|
29
26
|
options[:latestby] = params['latestby']
|
30
27
|
end
|
31
|
-
if params.key?('limit')
|
28
|
+
if params.key?('limit') && params['limit'] != ''
|
32
29
|
options[:limit] = params['limit']
|
33
30
|
end
|
34
|
-
if params.key?('latest')
|
31
|
+
if params.key?('latest') && params['latest'] != ''
|
35
32
|
options[:latest] = params['latest']
|
36
33
|
end
|
37
|
-
if params.key?('tag')
|
34
|
+
if params.key?('tag') && params['tag'] != ''
|
38
35
|
options[:tag] = params['tag']
|
39
36
|
end
|
40
37
|
return selectors, options
|
@@ -1,9 +1,13 @@
|
|
1
1
|
require 'pact_broker/repositories/helpers'
|
2
2
|
require 'pact_broker/matrix/row'
|
3
3
|
require 'pact_broker/matrix/latest_row'
|
4
|
+
require 'pact_broker/error'
|
4
5
|
|
5
6
|
module PactBroker
|
6
7
|
module Matrix
|
8
|
+
|
9
|
+
class Error < PactBroker::Error; end
|
10
|
+
|
7
11
|
class Repository
|
8
12
|
include PactBroker::Repositories::Helpers
|
9
13
|
include PactBroker::Repositories
|
@@ -78,7 +82,7 @@ module PactBroker
|
|
78
82
|
# resource validation currently stops tag being specified without latest=true
|
79
83
|
if selector[:tag] && selector[:latest]
|
80
84
|
version = version_repository.find_by_pacticpant_name_and_latest_tag(selector[:pacticipant_name], selector[:tag])
|
81
|
-
raise "Could not find version with tag #{selector[:tag].inspect} for #{selector[:pacticipant_name]}" unless version
|
85
|
+
raise Error.new("Could not find version with tag #{selector[:tag].inspect} for #{selector[:pacticipant_name]}") unless version
|
82
86
|
# validation in resource should ensure we always have a version
|
83
87
|
{
|
84
88
|
pacticipant_name: selector[:pacticipant_name],
|
@@ -122,37 +126,6 @@ module PactBroker
|
|
122
126
|
.flatten
|
123
127
|
.uniq
|
124
128
|
end
|
125
|
-
|
126
|
-
# def where_row_matches_selectors selectors, query
|
127
|
-
# if selectors.size == 1
|
128
|
-
# where_consumer_or_provider_is(selectors.first, query)
|
129
|
-
# else
|
130
|
-
# where_consumer_and_provider_in(selectors, query)
|
131
|
-
# end
|
132
|
-
# end
|
133
|
-
|
134
|
-
# def where_consumer_and_provider_in selectors, query
|
135
|
-
# query.where{
|
136
|
-
# Sequel.&(
|
137
|
-
# Sequel.|(
|
138
|
-
# *selectors.collect{ |s| s[:pacticipant_version_number] ? Sequel.&(consumer_name: s[:pacticipant_name], consumer_version_number: s[:pacticipant_version_number]) : Sequel.&(consumer_name: s[:pacticipant_name]) }
|
139
|
-
# ),
|
140
|
-
# Sequel.|(
|
141
|
-
# *(selectors.collect{ |s| s[:pacticipant_version_number] ? Sequel.&(provider_name: s[:pacticipant_name], provider_version_number: s[:pacticipant_version_number]) : Sequel.&(provider_name: s[:pacticipant_name]) } +
|
142
|
-
# selectors.collect{ |s| Sequel.&(provider_name: s[:pacticipant_name], provider_version_number: nil) })
|
143
|
-
# )
|
144
|
-
# )
|
145
|
-
# }
|
146
|
-
# end
|
147
|
-
|
148
|
-
# def where_consumer_or_provider_is s, query
|
149
|
-
# query.where{
|
150
|
-
# Sequel.|(
|
151
|
-
# s[:pacticipant_version_number] ? Sequel.&(consumer_name: s[:pacticipant_name], consumer_version_number: s[:pacticipant_version_number]) : Sequel.&(consumer_name: s[:pacticipant_name]),
|
152
|
-
# s[:pacticipant_version_number] ? Sequel.&(provider_name: s[:pacticipant_name], provider_version_number: s[:pacticipant_version_number]) : Sequel.&(provider_name: s[:pacticipant_name])
|
153
|
-
# )
|
154
|
-
# }
|
155
|
-
# end
|
156
129
|
end
|
157
130
|
end
|
158
131
|
end
|
@@ -16,6 +16,26 @@ module PactBroker
|
|
16
16
|
matrix_repository.find_for_consumer_and_provider params[:consumer_name], params[:provider_name]
|
17
17
|
end
|
18
18
|
|
19
|
+
def find_for_consumer_and_provider_with_tags params
|
20
|
+
consumer_criteria = {
|
21
|
+
pacticipant_name: params[:consumer_name],
|
22
|
+
tag: params[:tag],
|
23
|
+
latest: true
|
24
|
+
}
|
25
|
+
provider_criteria = {
|
26
|
+
pacticipant_name: params[:provider_name],
|
27
|
+
tag: params[:provider_tag],
|
28
|
+
latest: true
|
29
|
+
}
|
30
|
+
selectors = [consumer_criteria, provider_criteria]
|
31
|
+
options = { latestby: 'cvpv' }
|
32
|
+
if validate_selectors(selectors).empty?
|
33
|
+
matrix_repository.find(selectors, options).first
|
34
|
+
else
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
19
39
|
def find_compatible_pacticipant_versions criteria
|
20
40
|
matrix_repository.find_compatible_pacticipant_versions criteria
|
21
41
|
end
|
@@ -24,9 +44,7 @@ module PactBroker
|
|
24
44
|
error_messages = []
|
25
45
|
|
26
46
|
selectors.each do | s |
|
27
|
-
if s[:pacticipant_name].nil?
|
28
|
-
error_messages << "Please specify the pacticipant name and version"
|
29
|
-
elsif s[:pacticipant_name].nil?
|
47
|
+
if s[:pacticipant_name].nil?
|
30
48
|
error_messages << "Please specify the pacticipant name"
|
31
49
|
else
|
32
50
|
if s.key?(:pacticipant_version_number) && s.key?(:latest)
|
@@ -103,13 +103,20 @@ module PactBroker
|
|
103
103
|
end
|
104
104
|
|
105
105
|
def find_pact consumer_name, consumer_version, provider_name, pact_version_sha = nil
|
106
|
-
query =
|
106
|
+
query = if pact_version_sha
|
107
|
+
AllPactPublications
|
108
|
+
.pact_version_sha(pact_version_sha)
|
109
|
+
.reverse_order(:consumer_version_order)
|
110
|
+
.limit(1)
|
111
|
+
else
|
112
|
+
LatestPactPublicationsByConsumerVersion
|
113
|
+
end
|
107
114
|
query = query
|
108
115
|
.eager(:tags)
|
109
116
|
.consumer(consumer_name)
|
110
117
|
.provider(provider_name)
|
111
118
|
query = query.consumer_version_number(consumer_version) if consumer_version
|
112
|
-
query.
|
119
|
+
query.collect(&:to_domain_with_content)[0]
|
113
120
|
end
|
114
121
|
|
115
122
|
def find_all_revisions consumer_name, consumer_version, provider_name
|
@@ -102,7 +102,7 @@ module PactBroker
|
|
102
102
|
updated_pact = pact_repository.update existing_pact.id, params
|
103
103
|
|
104
104
|
if existing_pact.json_content != updated_pact.json_content
|
105
|
-
webhook_service.execute_webhooks updated_pact
|
105
|
+
webhook_service.execute_webhooks updated_pact, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
|
106
106
|
end
|
107
107
|
|
108
108
|
updated_pact
|
@@ -117,7 +117,7 @@ module PactBroker
|
|
117
117
|
|
118
118
|
def trigger_webhooks pact
|
119
119
|
if pact_has_changed_since_previous_version? pact
|
120
|
-
webhook_service.execute_webhooks pact
|
120
|
+
webhook_service.execute_webhooks pact, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
|
121
121
|
end
|
122
122
|
end
|
123
123
|
end
|
data/lib/pact_broker/services.rb
CHANGED
data/lib/pact_broker/ui/app.rb
CHANGED
@@ -3,8 +3,22 @@ require 'pact_broker/ui/controllers/groups'
|
|
3
3
|
require 'pact_broker/ui/controllers/matrix'
|
4
4
|
require 'pact_broker/doc/controllers/app'
|
5
5
|
|
6
|
+
|
6
7
|
module PactBroker
|
7
8
|
module UI
|
9
|
+
class PathInfoFixer
|
10
|
+
PATH_INFO = 'PATH_INFO'.freeze
|
11
|
+
|
12
|
+
def initialize app
|
13
|
+
@app = app
|
14
|
+
end
|
15
|
+
|
16
|
+
def call env
|
17
|
+
env[PATH_INFO] = '/' if env[PATH_INFO] == ''
|
18
|
+
@app.call(env)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
8
22
|
class App
|
9
23
|
|
10
24
|
def initialize
|
@@ -23,6 +37,7 @@ module PactBroker
|
|
23
37
|
end
|
24
38
|
|
25
39
|
map "/matrix" do
|
40
|
+
use PathInfoFixer
|
26
41
|
run PactBroker::UI::Controllers::Matrix
|
27
42
|
end
|
28
43
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'pact_broker/ui/controllers/base_controller'
|
2
2
|
require 'pact_broker/ui/view_models/matrix_line'
|
3
|
+
require 'pact_broker/matrix/parse_query'
|
4
|
+
require 'pact_broker/logging'
|
3
5
|
require 'haml'
|
4
6
|
|
5
7
|
module PactBroker
|
@@ -8,20 +10,73 @@ module PactBroker
|
|
8
10
|
class Matrix < Base
|
9
11
|
|
10
12
|
include PactBroker::Services
|
13
|
+
include PactBroker::Logging
|
14
|
+
|
15
|
+
get "/" do
|
16
|
+
selectors = [OpenStruct.new, OpenStruct.new]
|
17
|
+
options = { limit: 100, latestby: 'cvpv' }
|
18
|
+
locals = {
|
19
|
+
lines: [],
|
20
|
+
title: "The Matrix",
|
21
|
+
selectors: create_selector_objects(selectors),
|
22
|
+
options: create_options_model(options)
|
23
|
+
}
|
24
|
+
begin
|
25
|
+
if params[:q]
|
26
|
+
selectors, options = PactBroker::Matrix::ParseQuery.call(request.env['QUERY_STRING'])
|
27
|
+
locals[:selectors] = create_selector_objects(selectors)
|
28
|
+
locals[:options] = create_options_model(options)
|
29
|
+
errors = matrix_service.validate_selectors(selectors)
|
30
|
+
if errors.empty?
|
31
|
+
lines = matrix_service.find(selectors, options)
|
32
|
+
locals[:lines] = lines.collect{ |line| PactBroker::UI::ViewDomain::MatrixLine.new(line) }
|
33
|
+
else
|
34
|
+
locals[:errors] = errors
|
35
|
+
end
|
36
|
+
end
|
37
|
+
rescue StandardError => e
|
38
|
+
log_error(e) unless e.is_a?(PactBroker::Error)
|
39
|
+
locals[:errors] = [e.message]
|
40
|
+
end
|
41
|
+
haml :'matrix/show', {locals: locals, layout: :'layouts/main'}
|
42
|
+
end
|
11
43
|
|
12
44
|
get "/provider/:provider_name/consumer/:consumer_name" do
|
13
45
|
selectors = [{ pacticipant_name: params[:consumer_name] }, { pacticipant_name: params[:provider_name] } ]
|
14
|
-
|
15
|
-
lines =
|
46
|
+
options = {latestby: 'cvpv', limit: 100}
|
47
|
+
lines = matrix_service.find(selectors, options)
|
48
|
+
lines = lines.collect{ |line| PactBroker::UI::ViewDomain::MatrixLine.new(line) }.sort
|
16
49
|
locals = {
|
17
50
|
lines: lines,
|
18
51
|
title: "The Matrix",
|
19
52
|
consumer_name: params[:consumer_name],
|
20
|
-
provider_name: params[:provider_name]
|
53
|
+
provider_name: params[:provider_name],
|
54
|
+
selectors: create_selector_objects(selectors),
|
55
|
+
options: create_options_model(options)
|
21
56
|
}
|
22
57
|
haml :'matrix/show', {locals: locals, layout: :'layouts/main'}
|
23
58
|
end
|
24
59
|
|
60
|
+
def create_selector_objects(selector_hashes)
|
61
|
+
selector_hashes.collect do | selector_hash |
|
62
|
+
o = OpenStruct.new(selector_hash)
|
63
|
+
o.tag_disabled = o.tag ? nil : 'disabled'
|
64
|
+
o.version_disabled = o.pacticipant_version_number ? nil : 'disabled'
|
65
|
+
o.specify_latest_tag_checked = o.tag ? 'checked' : nil
|
66
|
+
o.specify_latest_checked = o.latest ? 'checked' : nil
|
67
|
+
o.specify_version_checked = o.pacticipant_version_number ? 'checked' : nil
|
68
|
+
o.specify_all_versions_checked = !(o.tag || o.pacticipant_version_number) ? 'checked' : nil
|
69
|
+
o
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def create_options_model(options)
|
74
|
+
o = OpenStruct.new(options)
|
75
|
+
o.cvpv_checked = o.latestby == 'cvpv' ? 'checked' : nil
|
76
|
+
o.cvp_checked = o.latestby == 'cvp' ? 'checked' : nil
|
77
|
+
o.all_rows_checked = o.latestby.nil? ? 'checked' : nil
|
78
|
+
o
|
79
|
+
end
|
25
80
|
end
|
26
81
|
end
|
27
82
|
end
|
@@ -1,13 +1,78 @@
|
|
1
1
|
%body
|
2
2
|
%link{rel: 'stylesheet', href: '/css/bootstrap.min.css'}
|
3
3
|
%link{rel: 'stylesheet', href: '/stylesheets/index.css'}
|
4
|
+
%link{rel: 'stylesheet', href: '/stylesheets/matrix.css'}
|
4
5
|
%script{type: 'text/javascript', src:'/javascripts/jquery-2.1.1.min.js'}
|
5
6
|
%script{type: 'text/javascript', src:'/javascripts/jquery.tablesorter.min.js'}
|
7
|
+
%script{type: 'text/javascript', src:'/javascripts/matrix.js'}
|
6
8
|
%script{type: 'text/javascript', src:'/js/bootstrap.min.js'}
|
7
9
|
|
10
|
+
-# This code is an embarassment. Sorry. Just trying to get as much stuff done in the little time I have.
|
11
|
+
|
8
12
|
.container
|
9
13
|
%h1.page-header
|
10
14
|
= title
|
15
|
+
|
16
|
+
- if defined?(errors) && errors.any?
|
17
|
+
- errors.each do | error |
|
18
|
+
%div.alert.alert-danger
|
19
|
+
= error
|
20
|
+
|
21
|
+
%form{action: '/matrix', onsubmit:'return onSubmit()'}
|
22
|
+
- selectors.each_with_index do | selector, index |
|
23
|
+
.selector
|
24
|
+
%label{for: "pacticipant#{index}"}
|
25
|
+
Pacticipant name
|
26
|
+
%input{name: 'q[]pacticipant', id: "pacticipant1#{index}", value: selector.pacticipant_name}
|
27
|
+
|
28
|
+
.input-group
|
29
|
+
%input{type: 'radio', name: "ignorethis#{index}", class: 'specify-all-versions version-selectorizor', value: 'all_versions', id: "pacticipant#{index}_all_versions", checked: selector.specify_all_versions_checked}
|
30
|
+
%label{for: "pacticipant#{index}_all_versions"}
|
31
|
+
All versions
|
32
|
+
|
33
|
+
.input-group
|
34
|
+
%input{type: 'radio', name: "ignorethis#{index}", class: 'specify-version version-selectorizor', value: 'version', id: "pacticipant#{index}_by_version", checked: selector.specify_version_checked}
|
35
|
+
%label{for: "pacticipant#{index}_by_version"}
|
36
|
+
Version
|
37
|
+
%input{name: 'q[]version', type: 'text', id: "pacticipant#{index}_version", class: 'by-version', value: selector.pacticipant_version_number}
|
38
|
+
|
39
|
+
.input-group
|
40
|
+
%input{type: 'radio', name: "ignorethis#{index}", class: 'specify-latest version-selectorizor', value: 'tag', id: "pacticipant#{index}_latest", checked: selector.specify_latest_checked}
|
41
|
+
%label{for: "pacticipant#{index}_latest"}
|
42
|
+
Latest version
|
43
|
+
%input{name: 'q[]latest', value: 'true', hidden: true, class: 'latest-flag'}
|
44
|
+
|
45
|
+
.input-group
|
46
|
+
%input{type: 'radio', name: "ignorethis#{index}", class: 'specify-latest-tag version-selectorizor', value: 'tag', id: "pacticipant#{index}_by_tag", checked: selector.specify_latest_tag_checked}
|
47
|
+
%label{for: "pacticipant#{index}_by_tag"}
|
48
|
+
Latest version with tag
|
49
|
+
%input{name: 'q[]tag', type: 'text', id: "pacticipant#{index}_tag", class: "by-latest-tag", value: selector.tag}
|
50
|
+
%input{name: 'q[]latest', value: 'true', hidden: true, class: 'latest-flag'}
|
51
|
+
|
52
|
+
%div.top-of-group
|
53
|
+
.input-group
|
54
|
+
%input{type: 'radio', name: "latestby", class: '', value: 'cvpv', id: 'cvpv', checked: options.cvpv_checked}
|
55
|
+
%label{for: 'cvpv'}
|
56
|
+
Show latest row for each consumer version/provider version
|
57
|
+
%div
|
58
|
+
.input-group
|
59
|
+
%input{type: 'radio', name: "latestby", class: '', value: 'cvp', id: 'cvp', checked: options.cvp_checked}
|
60
|
+
%label{for: 'cvp'}
|
61
|
+
Show latest row for each consumer version/provider
|
62
|
+
%div
|
63
|
+
.input-group
|
64
|
+
%input{type: 'radio', name: "latestby", class: '', value: '', id: 'all_rows', checked: options.all_rows_checked}
|
65
|
+
%label{for: 'all_rows'}
|
66
|
+
Show all rows
|
67
|
+
%div.top-of-group
|
68
|
+
%label{for: "limit"}
|
69
|
+
Limit
|
70
|
+
%input{name: 'limit', id: "limit", value: options.limit}
|
71
|
+
%div.top-of-group
|
72
|
+
%input{type: 'submit'}
|
73
|
+
|
74
|
+
|
75
|
+
|
11
76
|
%table.table.table-bordered.table-striped{id: 'matrix'}
|
12
77
|
%thead
|
13
78
|
%th.consumer
|
@@ -45,13 +110,3 @@
|
|
45
110
|
= line.provider_version_number
|
46
111
|
%td.verification-result{class: line.verification_status_class}
|
47
112
|
= line.verification_status
|
48
|
-
|
49
|
-
:javascript
|
50
|
-
$(function(){
|
51
|
-
$("#matrix").tablesorter({
|
52
|
-
textExtraction : function(node, table, cellIndex){
|
53
|
-
n = $(node);
|
54
|
-
return n.attr('data-sort-value') || n.text();
|
55
|
-
}
|
56
|
-
});
|
57
|
-
});
|
@@ -22,7 +22,8 @@ module PactBroker
|
|
22
22
|
provider_version_number = params.fetch('providerApplicationVersion')
|
23
23
|
PactBroker::Api::Decorators::VerificationDecorator.new(verification).from_hash(params)
|
24
24
|
verification.number = next_verification_number
|
25
|
-
|
25
|
+
webhook_service.execute_webhooks pact, PactBroker::Webhooks::WebhookEvent::VERIFICATION_PUBLISHED
|
26
|
+
verification = verification_repository.create(verification, provider_version_number, pact)
|
26
27
|
end
|
27
28
|
|
28
29
|
def errors params
|
@@ -35,6 +36,10 @@ module PactBroker
|
|
35
36
|
verification_repository.find(params.fetch(:consumer_name), params.fetch(:provider_name), params.fetch(:pact_version_sha), params.fetch(:verification_number))
|
36
37
|
end
|
37
38
|
|
39
|
+
def find_by_id id
|
40
|
+
PactBroker::Domain::Verification.find(id: id)
|
41
|
+
end
|
42
|
+
|
38
43
|
def find_latest_verifications_for_consumer_version params
|
39
44
|
verification_repository.find_latest_verifications_for_consumer_version params[:consumer_name], params[:consumer_version_number]
|
40
45
|
end
|
data/lib/pact_broker/version.rb
CHANGED
@@ -3,6 +3,7 @@ require 'pact_broker/domain/webhook'
|
|
3
3
|
require 'pact_broker/domain/pacticipant'
|
4
4
|
require 'pact_broker/db'
|
5
5
|
require 'pact_broker/webhooks/webhook'
|
6
|
+
require 'pact_broker/webhooks/webhook_event'
|
6
7
|
require 'pact_broker/webhooks/triggered_webhook'
|
7
8
|
require 'pact_broker/webhooks/latest_triggered_webhook'
|
8
9
|
require 'pact_broker/webhooks/execution'
|
@@ -21,6 +22,9 @@ module PactBroker
|
|
21
22
|
webhook.request.headers.each_pair do | name, value |
|
22
23
|
db_webhook.add_header PactBroker::Webhooks::WebhookHeader.from_domain(name, value, db_webhook.id)
|
23
24
|
end
|
25
|
+
(webhook.events || []).each do | webhook_event |
|
26
|
+
db_webhook.add_event(webhook_event)
|
27
|
+
end
|
24
28
|
find_by_uuid db_webhook.uuid
|
25
29
|
end
|
26
30
|
|
@@ -32,9 +36,13 @@ module PactBroker
|
|
32
36
|
existing_webhook = Webhook.find(uuid: uuid)
|
33
37
|
existing_webhook.update_from_domain(webhook).save
|
34
38
|
existing_webhook.headers.collect(&:delete)
|
39
|
+
existing_webhook.events.collect(&:delete)
|
35
40
|
webhook.request.headers.each_pair do | name, value |
|
36
41
|
existing_webhook.add_header PactBroker::Webhooks::WebhookHeader.from_domain(name, value, existing_webhook.id)
|
37
42
|
end
|
43
|
+
(webhook.events || []).each do | webhook_event |
|
44
|
+
existing_webhook.add_event(webhook_event)
|
45
|
+
end
|
38
46
|
find_by_uuid uuid
|
39
47
|
end
|
40
48
|
|
@@ -55,6 +63,15 @@ module PactBroker
|
|
55
63
|
Webhook.where(consumer_id: consumer.id, provider_id: provider.id).collect(&:to_domain)
|
56
64
|
end
|
57
65
|
|
66
|
+
def find_by_consumer_and_provider_and_event_name consumer, provider, event_name
|
67
|
+
Webhook
|
68
|
+
.select_all_qualified
|
69
|
+
.where(consumer_id: consumer.id, provider_id: provider.id)
|
70
|
+
.join(:webhook_events, { webhook_id: :id })
|
71
|
+
.where(Sequel[:webhook_events][:name] => event_name)
|
72
|
+
.collect(&:to_domain)
|
73
|
+
end
|
74
|
+
|
58
75
|
def find_by_consumer_and_provider_existing_at consumer, provider, date_time
|
59
76
|
Webhook.where(consumer_id: consumer.id, provider_id: provider.id)
|
60
77
|
.where(Sequel.lit("created_at < ?", date_time))
|