pact_broker 2.6.0 → 2.7.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/db/migrations/42_delete_orphan_webhook_data.rb +0 -2
- data/db/migrations/43_add_provider_version_to_verification.rb +12 -0
- data/db/migrations/44_populate_verifications_provider_version_id.rb +25 -0
- data/db/migrations/45_set_verification_provider_number_nullable.rb +7 -0
- data/db/migrations/46_recreate_latest_verifications.rb +18 -0
- data/db/migrations/47_create_all_verifications.rb +19 -0
- data/lib/pact_broker/api.rb +4 -0
- data/lib/pact_broker/api/decorators/matrix_decorator.rb +114 -0
- data/lib/pact_broker/api/decorators/verification_decorator.rb +1 -1
- data/lib/pact_broker/api/pact_broker_urls.rb +2 -2
- data/lib/pact_broker/api/resources/index.rb +3 -5
- data/lib/pact_broker/api/resources/matrix.rb +48 -0
- data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +42 -0
- data/lib/pact_broker/domain/relationship.rb +26 -6
- data/lib/pact_broker/domain/verification.rb +5 -1
- data/lib/pact_broker/matrix/repository.rb +51 -0
- data/lib/pact_broker/matrix/service.rb +50 -0
- data/lib/pact_broker/pacticipants/service.rb +21 -5
- data/lib/pact_broker/pacts/all_pact_publications.rb +11 -0
- data/lib/pact_broker/pacts/pact_publication.rb +4 -0
- data/lib/pact_broker/pacts/repository.rb +1 -1
- data/lib/pact_broker/repositories.rb +5 -0
- data/lib/pact_broker/services.rb +5 -0
- data/lib/pact_broker/tags/service.rb +0 -1
- data/lib/pact_broker/ui/app.rb +5 -0
- data/lib/pact_broker/ui/controllers/matrix.rb +27 -0
- data/lib/pact_broker/ui/controllers/relationships.rb +2 -2
- data/lib/pact_broker/ui/view_models/matrix_line.rb +79 -0
- data/lib/pact_broker/ui/view_models/relationship.rb +22 -4
- data/lib/pact_broker/ui/views/matrix/show.haml +42 -0
- data/lib/pact_broker/ui/views/relationships/show-prod-tags.haml +83 -0
- data/lib/pact_broker/ui/views/relationships/show.haml +1 -1
- data/lib/pact_broker/verifications/repository.rb +8 -1
- data/lib/pact_broker/verifications/service.rb +2 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/service.rb +7 -0
- data/lib/pact_broker/webhooks/status.rb +1 -1
- data/lib/rack/pact_broker/convert_file_extension_to_accept_header.rb +1 -1
- data/script/seed.rb +5 -0
- data/spec/features/get_matrix_for_consumer_and_provider_spec.rb +25 -0
- data/spec/features/get_matrix_spec.rb +31 -0
- data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +133 -0
- data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +2 -8
- data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +3 -2
- data/spec/lib/pact_broker/api/resources/matrix_spec.rb +38 -0
- data/spec/lib/pact_broker/domain/relationship_spec.rb +1 -1
- data/spec/lib/pact_broker/matrix/repository_spec.rb +153 -0
- data/spec/lib/pact_broker/matrix/service_spec.rb +46 -0
- data/spec/lib/pact_broker/pacticipants/service_spec.rb +78 -4
- data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +35 -0
- data/spec/lib/pact_broker/pacts/repository_spec.rb +16 -14
- data/spec/lib/pact_broker/ui/view_models/relationship_spec.rb +5 -6
- data/spec/lib/pact_broker/verifications/repository_spec.rb +7 -7
- data/spec/lib/pact_broker/verifications/service_spec.rb +6 -0
- data/spec/lib/pact_broker/versions/service_spec.rb +37 -0
- data/spec/lib/pact_broker/webhooks/status_spec.rb +6 -0
- data/spec/migrations/44_add_provider_version_to_verification_spec.rb +60 -0
- data/spec/service_consumers/provider_states_for_pact_broker_client.rb +12 -0
- data/spec/support/shared_examples_for_responses.rb +4 -0
- data/spec/support/test_data_builder.rb +26 -3
- metadata +34 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90467fc2becb470c346b1ebd5be1491fdbdcab06
|
4
|
+
data.tar.gz: 055474c47b67937de5c7dae44262cd0b9352b11c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 509f76090bfc2164c0c2d7e45c7bd0a191c1843f8fbc4966dcc097c4a154625e756cb52f659751969938b55018684b10c4313e7a3c202495fbaad1120127b215
|
7
|
+
data.tar.gz: 6f8c7ffffc1343040ce1f2ae9e96114bc13ba4bb01cd1ef02ff6104a4282015ef04a1d23110e63123b70b09864e34897c6bc525ee7018ff6cd4e5df913616603
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
<a name="v2.7.0.beta.1"></a>
|
2
|
+
### v2.7.0.beta.1 (2017-10-16)
|
3
|
+
|
4
|
+
#### Features
|
5
|
+
|
6
|
+
* **prod pacts in index**
|
7
|
+
* show pacts tagged as the 'prod' or 'production' versions on the index page ([b58b7a3](/../../commit/b58b7a3))
|
8
|
+
|
1
9
|
<a name="v2.6.0"></a>
|
2
10
|
### v2.6.0 (2017-10-06)
|
3
11
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
change do
|
3
|
+
alter_table(:verifications) do
|
4
|
+
add_foreign_key(:provider_version_id, :versions, foreign_key_constraint_name: 'fk_verifications_versions')
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
# TODO
|
9
|
+
# alter_table(:verifications) do
|
10
|
+
# set_column_not_null(:provider_version_id)
|
11
|
+
# end
|
12
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
up do
|
3
|
+
from(:verifications)
|
4
|
+
.select(Sequel[:verifications][:id], :provider_version, :provider_id, Sequel[:verifications][:created_at])
|
5
|
+
.join(:pact_versions, {id: :pact_version_id})
|
6
|
+
.each do | line |
|
7
|
+
version = from(:versions)
|
8
|
+
.where(number: line[:provider_version], pacticipant_id: line[:provider_id]).single_record
|
9
|
+
version_id = if version
|
10
|
+
version[:id]
|
11
|
+
else
|
12
|
+
from(:versions).insert(
|
13
|
+
number: line[:provider_version],
|
14
|
+
pacticipant_id: line[:provider_id],
|
15
|
+
created_at: line[:created_at],
|
16
|
+
updated_at: line[:created_at]
|
17
|
+
)
|
18
|
+
end
|
19
|
+
from(:verifications).where(id: line[:id]).update(provider_version_id: version_id)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
down do
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
up do
|
3
|
+
create_or_replace_view(:latest_verification_numbers,
|
4
|
+
"SELECT pact_version_id, MAX(number) latest_number
|
5
|
+
FROM verifications
|
6
|
+
GROUP BY pact_version_id")
|
7
|
+
|
8
|
+
# The most recent verification for each pact version
|
9
|
+
# provider_version is DEPRECATED, use provider_version_number
|
10
|
+
create_or_replace_view(:latest_verifications,
|
11
|
+
"SELECT v.id, v.number, v.success, s.number as provider_version, v.build_url, v.pact_version_id, v.execution_date, v.created_at, v.provider_version_id, s.number as provider_version_number
|
12
|
+
FROM verifications v
|
13
|
+
INNER JOIN latest_verification_numbers lv
|
14
|
+
ON v.pact_version_id = lv.pact_version_id AND v.number = lv.latest_number
|
15
|
+
INNER JOIN versions s on v.provider_version_id = s.id"
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
up do
|
3
|
+
# provider_version is DEPRECATED, use provider_version_number
|
4
|
+
create_or_replace_view(:all_verifications,
|
5
|
+
from(:verifications).select(
|
6
|
+
Sequel[:verifications][:id],
|
7
|
+
Sequel[:verifications][:number],
|
8
|
+
:success,
|
9
|
+
:provider_version_id,
|
10
|
+
Sequel[:v][:number].as(:provider_version_number),
|
11
|
+
Sequel[:v][:order].as(:provider_version_order),
|
12
|
+
:build_url,
|
13
|
+
:pact_version_id,
|
14
|
+
:execution_date,
|
15
|
+
Sequel[:verifications][:created_at]
|
16
|
+
).join(:versions, {id: :provider_version_id}, {:table_alias => :v})
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
data/lib/pact_broker/api.rb
CHANGED
@@ -59,6 +59,10 @@ module PactBroker
|
|
59
59
|
add ['relationships'], Api::Resources::Relationships, {resource_name: "relationships"}
|
60
60
|
add ['groups', :pacticipant_name], Api::Resources::Group, {resource_name: "group"}
|
61
61
|
|
62
|
+
# matrix
|
63
|
+
add ['matrix', 'provider', :provider_name, 'consumer', :consumer_name], Api::Resources::MatrixForConsumerAndProvider, {resource_name: "matrix_consumer_provider"}
|
64
|
+
add ['matrix'], Api::Resources::Matrix, {resource_name: "matrix"}
|
65
|
+
|
62
66
|
add [], Api::Resources::Index, {resource_name: "index"}
|
63
67
|
end
|
64
68
|
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'pact_broker/api/pact_broker_urls'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Api
|
6
|
+
module Decorators
|
7
|
+
class MatrixPactDecorator
|
8
|
+
include PactBroker::Api::PactBrokerUrls
|
9
|
+
|
10
|
+
def initialize(lines)
|
11
|
+
@lines = lines
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_json(options)
|
15
|
+
to_hash(options).to_json
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_hash(options)
|
19
|
+
{
|
20
|
+
matrix: matrix(lines, options[:user_options][:base_url])
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :lines
|
27
|
+
|
28
|
+
def matrix(lines, base_url)
|
29
|
+
provider = nil
|
30
|
+
consumer = nil
|
31
|
+
lines.collect do | line |
|
32
|
+
provider ||= OpenStruct.new(name: line[:provider_name])
|
33
|
+
consumer ||= OpenStruct.new(name: line[:consumer_name])
|
34
|
+
consumer_version = OpenStruct.new(number: line[:consumer_version_number], pacticipant: consumer)
|
35
|
+
line_hash(consumer, provider, consumer_version, line, base_url)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def line_hash(consumer, provider, consumer_version, line, base_url)
|
40
|
+
{
|
41
|
+
consumer: consumer_hash(line, consumer, consumer_version, base_url),
|
42
|
+
provider: provider_hash(line, provider, base_url),
|
43
|
+
pact: pact_hash(line, base_url),
|
44
|
+
verificationResult: verification_hash(line, base_url)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def consumer_hash(line, consumer, consumer_version, base_url)
|
49
|
+
{
|
50
|
+
name: line[:consumer_name],
|
51
|
+
version: {
|
52
|
+
number: line[:consumer_version_number],
|
53
|
+
_links: {
|
54
|
+
self: {
|
55
|
+
href: version_url(base_url, consumer_version)
|
56
|
+
}
|
57
|
+
}
|
58
|
+
},
|
59
|
+
_links: {
|
60
|
+
self: {
|
61
|
+
href: pacticipant_url(base_url, consumer)
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def provider_hash(line, provider, base_url)
|
68
|
+
hash = {
|
69
|
+
name: line[:provider_name],
|
70
|
+
version: nil,
|
71
|
+
_links: {
|
72
|
+
self: {
|
73
|
+
href: pacticipant_url(base_url, provider)
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
if !line[:provider_version_number].nil?
|
79
|
+
hash[:version] = { number: line[:provider_version_number] }
|
80
|
+
end
|
81
|
+
|
82
|
+
hash
|
83
|
+
end
|
84
|
+
|
85
|
+
def pact_hash(line, base_url)
|
86
|
+
{
|
87
|
+
createdAt: line[:pact_created_at].to_datetime.xmlschema,
|
88
|
+
_links: {
|
89
|
+
self: {
|
90
|
+
href: pact_url_from_params(base_url, line)
|
91
|
+
}
|
92
|
+
}
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
def verification_hash(line, base_url)
|
97
|
+
if !line[:success].nil?
|
98
|
+
{
|
99
|
+
success: line[:success],
|
100
|
+
verifiedAt: line[:verification_executed_at].to_datetime.xmlschema,
|
101
|
+
_links: {
|
102
|
+
self: {
|
103
|
+
href: verification_url(OpenStruct.new(line), base_url)
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}
|
107
|
+
else
|
108
|
+
nil
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -6,7 +6,7 @@ module PactBroker
|
|
6
6
|
class VerificationDecorator < BaseDecorator
|
7
7
|
|
8
8
|
property :provider_name, as: :providerName, writeable: :false
|
9
|
-
property :
|
9
|
+
property :provider_version_number, as: :providerApplicationVersion, writeable: false
|
10
10
|
property :success
|
11
11
|
property :execution_date, as: :verificationDate
|
12
12
|
property :build_url, as: :buildUrl
|
@@ -76,11 +76,11 @@ module PactBroker
|
|
76
76
|
].join('/')
|
77
77
|
end
|
78
78
|
|
79
|
-
def verification_url verification, base_url
|
79
|
+
def verification_url verification, base_url = ''
|
80
80
|
[ base_url, 'pacts',
|
81
81
|
'provider', url_encode(verification.provider_name),
|
82
82
|
'consumer', url_encode(verification.consumer_name),
|
83
|
-
'pact-version', verification.
|
83
|
+
'pact-version', verification.pact_version_sha,
|
84
84
|
'verification-results', verification.number
|
85
85
|
].join('/')
|
86
86
|
end
|
@@ -58,7 +58,8 @@ module PactBroker
|
|
58
58
|
href: base_url + '/webhooks',
|
59
59
|
title: 'Webhooks',
|
60
60
|
templated: false
|
61
|
-
},
|
61
|
+
},
|
62
|
+
'curies' =>
|
62
63
|
[{
|
63
64
|
name: 'pb',
|
64
65
|
href: base_url + '/doc/{rel}',
|
@@ -67,10 +68,7 @@ module PactBroker
|
|
67
68
|
}
|
68
69
|
}.to_json
|
69
70
|
end
|
70
|
-
|
71
|
-
|
72
71
|
end
|
73
72
|
end
|
74
|
-
|
75
73
|
end
|
76
|
-
end
|
74
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'pact_broker/api/resources/base_resource'
|
2
|
+
require 'pact_broker/api/decorators/matrix_decorator'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
module PactBroker
|
6
|
+
module Api
|
7
|
+
module Resources
|
8
|
+
class Matrix < BaseResource
|
9
|
+
|
10
|
+
def content_types_provided
|
11
|
+
[["application/hal+json", :to_json]]
|
12
|
+
end
|
13
|
+
|
14
|
+
def allowed_methods
|
15
|
+
["GET"]
|
16
|
+
end
|
17
|
+
|
18
|
+
def malformed_request?
|
19
|
+
error_messages = matrix_service.validate_selectors(selectors)
|
20
|
+
if error_messages.any?
|
21
|
+
set_json_validation_error_messages error_messages
|
22
|
+
true
|
23
|
+
else
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_json
|
29
|
+
criteria = selected_versions.each_with_object({}) { | version, hash | hash[version.pacticipant.name] = version.number }
|
30
|
+
lines = matrix_service.find_compatible_pacticipant_versions(criteria)
|
31
|
+
PactBroker::Api::Decorators::MatrixPactDecorator.new(lines).to_json(user_options: { base_url: base_url })
|
32
|
+
end
|
33
|
+
|
34
|
+
def selectors
|
35
|
+
@selectors ||= CGI.parse(CGI.unescape(request.uri.query))['selectors[]']
|
36
|
+
end
|
37
|
+
|
38
|
+
def version_selectors
|
39
|
+
@version_selectors ||= selectors.select{ | selector| selector.include?("/version/") }
|
40
|
+
end
|
41
|
+
|
42
|
+
def selected_versions
|
43
|
+
@selected_versions ||= version_service.find_versions_by_selector(version_selectors)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'pact_broker/api/resources/base_resource'
|
2
|
+
require 'pact_broker/api/decorators/matrix_decorator'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Api
|
6
|
+
module Resources
|
7
|
+
class MatrixForConsumerAndProvider < BaseResource
|
8
|
+
|
9
|
+
def content_types_provided
|
10
|
+
[["application/hal+json", :to_json]]
|
11
|
+
end
|
12
|
+
|
13
|
+
def allowed_methods
|
14
|
+
["GET"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def resource_exists?
|
18
|
+
consumer && provider
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_json
|
22
|
+
lines = matrix_service.find(identifier_from_path)
|
23
|
+
PactBroker::Api::Decorators::MatrixPactDecorator.new(lines).to_json(user_options: { base_url: base_url })
|
24
|
+
end
|
25
|
+
|
26
|
+
def consumer
|
27
|
+
@consumer ||= find_pacticipant(identifier_from_path[:consumer_name], "consumer")
|
28
|
+
end
|
29
|
+
|
30
|
+
def provider
|
31
|
+
@provider ||= find_pacticipant(identifier_from_path[:provider_name], "provider")
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_pacticipant name, role
|
35
|
+
pacticipant_service.find_pacticipant_by_name(name).tap do | pacticipant |
|
36
|
+
set_json_error_message("No #{role} with name '#{name}' found") if pacticipant.nil?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -7,22 +7,26 @@ module PactBroker
|
|
7
7
|
|
8
8
|
attr_reader :consumer, :provider, :latest_pact, :latest_verification, :webhooks
|
9
9
|
|
10
|
-
def initialize consumer, provider, latest_pact = nil, latest_verification = nil, webhooks = [], triggered_webhooks = []
|
10
|
+
def initialize consumer, provider, latest_pact = nil, latest = true, latest_verification = nil, webhooks = [], triggered_webhooks = [], tags = []
|
11
11
|
@consumer = consumer
|
12
12
|
@provider = provider
|
13
13
|
@latest_pact = latest_pact
|
14
|
+
@latest = latest
|
14
15
|
@latest_verification = latest_verification
|
15
16
|
@webhooks = webhooks
|
16
17
|
@triggered_webhooks = triggered_webhooks
|
18
|
+
@tags = tags
|
17
19
|
end
|
18
20
|
|
19
|
-
def self.create consumer, provider, latest_pact, latest_verification, webhooks = [], triggered_webhooks = []
|
20
|
-
new consumer, provider, latest_pact, latest_verification, webhooks, triggered_webhooks
|
21
|
+
def self.create consumer, provider, latest_pact, latest, latest_verification, webhooks = [], triggered_webhooks = [], tags = []
|
22
|
+
new consumer, provider, latest_pact, latest, latest_verification, webhooks, triggered_webhooks, tags
|
21
23
|
end
|
22
24
|
|
23
25
|
def eq? other
|
24
26
|
Relationship === other && other.consumer == consumer && other.provider == provider &&
|
25
|
-
other.latest_pact == latest_pact &&
|
27
|
+
other.latest_pact == latest_pact &&
|
28
|
+
other.latest? == latest? &&
|
29
|
+
other.latest_verification == latest_verification &&
|
26
30
|
other.webhooks == webhooks
|
27
31
|
end
|
28
32
|
|
@@ -42,6 +46,22 @@ module PactBroker
|
|
42
46
|
@latest_pact
|
43
47
|
end
|
44
48
|
|
49
|
+
def latest?
|
50
|
+
@latest
|
51
|
+
end
|
52
|
+
|
53
|
+
def consumer_version_number
|
54
|
+
@latest_pact.consumer_version_number
|
55
|
+
end
|
56
|
+
|
57
|
+
def provider_version_number
|
58
|
+
@latest_verification ? @latest_verification.provider_version_number : nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def tag_names
|
62
|
+
@tags
|
63
|
+
end
|
64
|
+
|
45
65
|
def any_webhooks?
|
46
66
|
@webhooks.any?
|
47
67
|
end
|
@@ -74,8 +94,8 @@ module PactBroker
|
|
74
94
|
latest_verification.pact_version_sha != latest_pact.pact_version_sha
|
75
95
|
end
|
76
96
|
|
77
|
-
def
|
78
|
-
latest_verification.provider_version
|
97
|
+
def latest_verification_provider_version_number
|
98
|
+
latest_verification.provider_version.number
|
79
99
|
end
|
80
100
|
|
81
101
|
def pacticipants
|