pact_broker 2.6.0 → 2.7.0.beta.1
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.
- 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
|