pact_broker 2.68.1 → 2.73.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.
- checksums.yaml +4 -4
- data/.github/workflows/release_gem.yml +7 -1
- data/.github/workflows/test.yml +54 -0
- data/CHANGELOG.md +70 -0
- data/DEVELOPER_SETUP.md +6 -0
- data/Dockerfile +8 -3
- data/Gemfile +6 -1
- data/ISSUES.md +23 -0
- data/config/database.yml +14 -0
- data/db/ddl_statements/latest_verification_ids_for_consumer_and_provider.rb +25 -0
- data/db/migrations/20180524_create_latest_verifications_for_consumer_and_provider.rb +4 -11
- data/db/migrations/20180614_update_latest_verification_ids_for_consumer_and_provider.rb +6 -18
- data/db/migrations/20201026_update_latest_verification_ids_for_consumer_and_provider.rb +14 -0
- data/docker-compose-ci-mysql.yml +37 -0
- data/docker-compose-issue-repro.yml +11 -7
- data/lib/db.rb +1 -0
- data/lib/pact/doc/interaction_view_model.rb +12 -0
- data/lib/pact/doc/markdown/interaction.erb +3 -3
- data/lib/pact/doc/markdown/interaction_renderer.rb +2 -1
- data/lib/pact_broker/api/decorators/extended_pact_decorator.rb +9 -1
- data/lib/pact_broker/api/decorators/extended_verification_decorator.rb +8 -0
- data/lib/pact_broker/api/decorators/matrix_decorator.rb +9 -4
- data/lib/pact_broker/api/decorators/pact_decorator.rb +8 -0
- data/lib/pact_broker/api/decorators/tag_decorator.rb +0 -3
- data/lib/pact_broker/api/pact_broker_urls.rb +6 -2
- data/lib/pact_broker/api/resources/clean.rb +36 -0
- data/lib/pact_broker/api/resources/error_handler.rb +1 -1
- data/lib/pact_broker/api/resources/group.rb +5 -1
- data/lib/pact_broker/api/resources/metadata_resource_methods.rb +23 -0
- data/lib/pact_broker/api/resources/pact.rb +2 -13
- data/lib/pact_broker/api/resources/pact_content_diff.rb +1 -1
- data/lib/pact_broker/api/resources/pact_resource_methods.rb +23 -0
- data/lib/pact_broker/api/resources/pact_version.rb +3 -0
- data/lib/pact_broker/api/resources/tagged_pact_versions.rb +4 -0
- data/lib/pact_broker/api/resources/verifications.rb +2 -4
- data/lib/pact_broker/api/resources/webhooks.rb +1 -1
- data/lib/pact_broker/app.rb +1 -0
- data/lib/pact_broker/configuration.rb +12 -4
- data/lib/pact_broker/db/clean.rb +34 -11
- data/lib/pact_broker/db/clean_incremental.rb +217 -0
- data/lib/pact_broker/db/delete_overwritten_data.rb +55 -27
- data/lib/pact_broker/domain/tag.rb +111 -8
- data/lib/pact_broker/domain/verification.rb +93 -0
- data/lib/pact_broker/domain/version.rb +35 -1
- data/lib/pact_broker/logging.rb +7 -0
- data/lib/pact_broker/matrix/unresolved_selector.rb +12 -0
- data/lib/pact_broker/metrics/service.rb +17 -4
- data/lib/pact_broker/pacts/all_pact_publications.rb +9 -3
- data/lib/pact_broker/pacts/latest_pact_publications.rb +15 -0
- data/lib/pact_broker/pacts/metadata.rb +3 -1
- data/lib/pact_broker/pacts/pact_publication.rb +7 -1
- data/lib/pact_broker/pacts/repository.rb +39 -13
- data/lib/pact_broker/pacts/verifiable_pact_messages.rb +1 -1
- data/lib/pact_broker/tags/tag_with_latest_flag.rb +2 -0
- data/lib/pact_broker/tasks/clean_task.rb +48 -4
- data/lib/pact_broker/tasks/delete_overwritten_data_task.rb +23 -7
- data/lib/pact_broker/test/http_test_data_builder.rb +53 -6
- data/lib/pact_broker/test/test_data_builder.rb +24 -0
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/webhooks/triggered_webhook.rb +6 -0
- data/lib/sequel/extensions/statement_timeout.rb +22 -0
- data/pact_broker.gemspec +1 -1
- data/script/docker-container/test.sh +3 -0
- data/script/docker/db-psql.sh +3 -0
- data/script/docker/db-reload.sh +11 -0
- data/script/docker/db-start.sh +1 -1
- data/script/pry.rb +25 -0
- data/script/reproduce-issue-starting-up.rb +43 -0
- data/script/reproduce-issue.rb +18 -15
- data/script/seed.rb +1 -0
- data/script/test/run-rake-on-docker-compose-mysql.sh +8 -0
- data/spec/features/delete_tagged_pact_versions_spec.rb +2 -2
- data/spec/features/get_pact_spec.rb +2 -2
- data/spec/features/get_pact_version.rb +26 -3
- data/spec/fixtures/approvals/clean_incremental_dry_run.approved.json +100 -0
- data/spec/fixtures/approvals/modifiable_resources.approved.json +3 -0
- data/spec/lib/pact/doc/interaction_view_model_spec.rb +46 -0
- data/spec/lib/pact/doc/markdown/consumer_contract_renderer_spec.rb +11 -0
- data/spec/lib/pact_broker/api/decorators/extended_pact_decorator_spec.rb +1 -0
- data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +20 -8
- data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +15 -1
- data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +16 -0
- data/spec/lib/pact_broker/api/resources/group_spec.rb +9 -7
- data/spec/lib/pact_broker/api/resources/pact_spec.rb +20 -9
- data/spec/lib/pact_broker/api/resources/tagged_pact_versions_spec.rb +10 -2
- data/spec/lib/pact_broker/api/resources/verifications_spec.rb +7 -3
- data/spec/lib/pact_broker/db/clean_incremental_spec.rb +119 -0
- data/spec/lib/pact_broker/db/clean_spec.rb +4 -8
- data/spec/lib/pact_broker/db/delete_overwritten_data_spec.rb +71 -11
- data/spec/lib/pact_broker/domain/tag_spec.rb +60 -0
- data/spec/lib/pact_broker/domain/verification_spec.rb +62 -0
- data/spec/lib/pact_broker/domain/version_spec.rb +23 -0
- data/spec/lib/pact_broker/metrics/service_spec.rb +4 -1
- data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +3 -1
- data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +14 -1
- data/spec/lib/pact_broker/pacts/repository_spec.rb +54 -7
- data/spec/lib/pact_broker/pacts/selected_pact_spec.rb +23 -0
- data/spec/migrations/change_migration_strategy_spec.rb +1 -1
- data/spec/support/markdown_pact_v3.json +44 -0
- metadata +33 -7
|
@@ -8,6 +8,8 @@ module Pact
|
|
|
8
8
|
|
|
9
9
|
include Pact::ActiveSupportSupport
|
|
10
10
|
|
|
11
|
+
MARKDOWN_BOLD_CHARACTERS = '**'
|
|
12
|
+
|
|
11
13
|
def initialize interaction, consumer_contract
|
|
12
14
|
@interaction = interaction
|
|
13
15
|
@consumer_contract = consumer_contract
|
|
@@ -52,6 +54,16 @@ module Pact
|
|
|
52
54
|
markdown_escape apply_capitals(@interaction.provider_state.strip, start_of_sentence)
|
|
53
55
|
end
|
|
54
56
|
|
|
57
|
+
def formatted_provider_states mark_bold: false
|
|
58
|
+
bold_marker = mark_bold ? MARKDOWN_BOLD_CHARACTERS : ''
|
|
59
|
+
|
|
60
|
+
(@interaction.provider_states || []).map do |ps|
|
|
61
|
+
"#{bold_marker}" \
|
|
62
|
+
"#{markdown_escape(apply_capitals(ps.name.strip, false))}" \
|
|
63
|
+
"#{bold_marker}"
|
|
64
|
+
end.join(' and ')
|
|
65
|
+
end
|
|
66
|
+
|
|
55
67
|
def description start_of_sentence = false
|
|
56
68
|
return '' unless @interaction.description
|
|
57
69
|
markdown_escape apply_capitals(@interaction.description.strip, start_of_sentence)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<a name="<%= interaction.id %>"></a
|
|
2
|
-
<%= if
|
|
3
|
-
"Given
|
|
1
|
+
<a name="<%= interaction.id %>"></a><% formatted_provider_states = h(interaction.formatted_provider_states mark_bold: true) %>
|
|
2
|
+
<%= if !formatted_provider_states.empty?
|
|
3
|
+
"Given #{formatted_provider_states}, upon receiving"
|
|
4
4
|
else
|
|
5
5
|
"Upon receiving"
|
|
6
6
|
end
|
|
@@ -13,7 +13,8 @@ module Pact
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def render_summary
|
|
16
|
-
|
|
16
|
+
formatted_provider_states = h(interaction.formatted_provider_states)
|
|
17
|
+
suffix = formatted_provider_states.empty? ? "" : " given #{formatted_provider_states}"
|
|
17
18
|
"* [#{h(interaction.description(true))}](##{interaction.id})#{suffix}\n\n"
|
|
18
19
|
end
|
|
19
20
|
|
|
@@ -11,6 +11,14 @@ module PactBroker
|
|
|
11
11
|
property :name
|
|
12
12
|
property :latest, getter: ->(_) { true }
|
|
13
13
|
|
|
14
|
+
link :self do | options |
|
|
15
|
+
{
|
|
16
|
+
title: 'Tag',
|
|
17
|
+
name: represented.name,
|
|
18
|
+
href: tag_url(options[:base_url], represented)
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
|
|
14
22
|
link "pb:latest-pact" do | opts |
|
|
15
23
|
{
|
|
16
24
|
name: "The latest pact with the tag #{represented.name}",
|
|
@@ -33,7 +41,7 @@ module PactBroker
|
|
|
33
41
|
|
|
34
42
|
def head_tags
|
|
35
43
|
represented.head_tag_names.collect do | tag_name |
|
|
36
|
-
OpenStruct.new(name: tag_name, pact: represented)
|
|
44
|
+
OpenStruct.new(name: tag_name, pact: represented, version: represented.consumer_version)
|
|
37
45
|
end
|
|
38
46
|
end
|
|
39
47
|
end
|
|
@@ -7,6 +7,14 @@ module PactBroker
|
|
|
7
7
|
class TagDecorator < BaseDecorator
|
|
8
8
|
property :name
|
|
9
9
|
property :latest?, as: :latest
|
|
10
|
+
|
|
11
|
+
link :self do | options |
|
|
12
|
+
{
|
|
13
|
+
title: 'Tag',
|
|
14
|
+
name: represented.name,
|
|
15
|
+
href: tag_url(options[:base_url], represented)
|
|
16
|
+
}
|
|
17
|
+
end
|
|
10
18
|
end
|
|
11
19
|
|
|
12
20
|
collection :provider_version_tags, as: :tags, embedded: true, extend: TagDecorator
|
|
@@ -76,7 +76,7 @@ module PactBroker
|
|
|
76
76
|
href: version_url(base_url, consumer_version)
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
|
-
tags: tags(line.consumer_version_tags)
|
|
79
|
+
tags: tags(line.consumer_version_tags, base_url)
|
|
80
80
|
},
|
|
81
81
|
_links: {
|
|
82
82
|
self: {
|
|
@@ -86,11 +86,16 @@ module PactBroker
|
|
|
86
86
|
}
|
|
87
87
|
end
|
|
88
88
|
|
|
89
|
-
def tags(tags)
|
|
89
|
+
def tags(tags, base_url)
|
|
90
90
|
tags.collect do | tag |
|
|
91
91
|
{
|
|
92
92
|
name: tag.name,
|
|
93
|
-
latest: tag.latest
|
|
93
|
+
latest: tag.latest?,
|
|
94
|
+
_links: {
|
|
95
|
+
self: {
|
|
96
|
+
href: tag_url(base_url, tag)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
94
99
|
}
|
|
95
100
|
end
|
|
96
101
|
end
|
|
@@ -114,7 +119,7 @@ module PactBroker
|
|
|
114
119
|
href: version_url(base_url, provider_version)
|
|
115
120
|
}
|
|
116
121
|
},
|
|
117
|
-
tags: tags(line.provider_version_tags)
|
|
122
|
+
tags: tags(line.provider_version_tags, base_url)
|
|
118
123
|
}
|
|
119
124
|
end
|
|
120
125
|
|
|
@@ -50,6 +50,14 @@ module PactBroker
|
|
|
50
50
|
}
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
+
link :'pb:pact-version' do | options |
|
|
54
|
+
{
|
|
55
|
+
title: "Pact content version permalink",
|
|
56
|
+
name: represented.pact_version_sha,
|
|
57
|
+
href: pact_version_url(represented, options.fetch(:base_url))
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
|
|
53
61
|
link :'pb:latest-pact-version' do | options |
|
|
54
62
|
{
|
|
55
63
|
title: "Latest version of this pact",
|
|
@@ -75,7 +75,7 @@ module PactBroker
|
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
def decode_pact_metadata(metadata)
|
|
78
|
-
if metadata
|
|
78
|
+
if metadata && metadata != ''
|
|
79
79
|
begin
|
|
80
80
|
Rack::Utils.parse_nested_query(Base64.strict_decode64(metadata)).each_with_object({}) do | (k, v), new_hash |
|
|
81
81
|
new_hash[k.to_sym] = v
|
|
@@ -116,6 +116,10 @@ module PactBroker
|
|
|
116
116
|
"#{base_url}/pacts/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}/versions"
|
|
117
117
|
end
|
|
118
118
|
|
|
119
|
+
def tagged_pact_versions_url consumer_name, provider_name, tag, base_url = ""
|
|
120
|
+
"#{base_url}/pacts/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}/tag/#{url_encode(tag)}"
|
|
121
|
+
end
|
|
122
|
+
|
|
119
123
|
def integration_url consumer_name, provider_name, base_url = ""
|
|
120
124
|
"#{base_url}/integrations/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}"
|
|
121
125
|
end
|
|
@@ -197,7 +201,7 @@ module PactBroker
|
|
|
197
201
|
end
|
|
198
202
|
|
|
199
203
|
def tag_url base_url, tag
|
|
200
|
-
"#{tags_url(base_url, tag.version)}/#{tag.name}"
|
|
204
|
+
"#{tags_url(base_url, tag.version)}/#{url_encode(tag.name)}"
|
|
201
205
|
end
|
|
202
206
|
|
|
203
207
|
def templated_tag_url_for_pacticipant pacticipant_name, base_url = ""
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'pact_broker/api/resources/base_resource'
|
|
2
|
+
require 'pact_broker/db/clean'
|
|
3
|
+
require 'pact_broker/matrix/unresolved_selector'
|
|
4
|
+
|
|
5
|
+
module PactBroker
|
|
6
|
+
module Api
|
|
7
|
+
module Resources
|
|
8
|
+
class Clean < BaseResource
|
|
9
|
+
def content_types_accepted
|
|
10
|
+
[["application/json"]]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def content_types_provided
|
|
14
|
+
[["application/hal+json"]]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def allowed_methods
|
|
18
|
+
["POST", "OPTIONS"]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def process_post
|
|
22
|
+
keep_selectors = (params[:keep] || []).collect do | hash |
|
|
23
|
+
PactBroker::Matrix::UnresolvedSelector.new(hash)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
result = PactBroker::DB::Clean.call(Sequel::Model.db, { keep: keep_selectors })
|
|
27
|
+
response.body = result.to_json
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def policy_name
|
|
31
|
+
:'integrations::clean'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -29,7 +29,7 @@ module PactBroker
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def self.log_as_warning?(e)
|
|
32
|
-
PactBroker.configuration.warning_error_classes.any? { |clazz| e.is_a?(clazz) }
|
|
32
|
+
PactBroker.configuration.warning_error_classes.any? { |clazz| e.is_a?(clazz) || e.cause&.is_a?(clazz) }
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def self.display_message(e, obfuscated_message)
|
|
@@ -18,7 +18,11 @@ module PactBroker
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def to_csv
|
|
21
|
-
|
|
21
|
+
if group
|
|
22
|
+
PactBroker::Api::Decorators::RelationshipsCsvDecorator.new(group).to_csv
|
|
23
|
+
else
|
|
24
|
+
""
|
|
25
|
+
end
|
|
22
26
|
end
|
|
23
27
|
|
|
24
28
|
def policy_name
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'pact_broker/hash_refinements'
|
|
2
|
+
|
|
3
|
+
module PactBroker
|
|
4
|
+
module Api
|
|
5
|
+
module Resources
|
|
6
|
+
module MetadataResourceMethods
|
|
7
|
+
using PactBroker::HashRefinements
|
|
8
|
+
|
|
9
|
+
def pact_params
|
|
10
|
+
@pact_params ||= PactBroker::Pacts::PactParams.from_request(request, maybe_params_with_consumer_version_number.merge(path_info))
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def maybe_params_with_consumer_version_number
|
|
14
|
+
metadata.slice(:consumer_version_number)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def metadata
|
|
18
|
+
@metadata ||= PactBrokerUrls.decode_pact_metadata(identifier_from_path[:metadata])
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -8,6 +8,7 @@ require 'pact_broker/pacts/pact_params'
|
|
|
8
8
|
require 'pact_broker/api/contracts/put_pact_params_contract'
|
|
9
9
|
require 'pact_broker/webhooks/execution_configuration'
|
|
10
10
|
require 'pact_broker/api/resources/webhook_execution_methods'
|
|
11
|
+
require 'pact_broker/api/resources/pact_resource_methods'
|
|
11
12
|
|
|
12
13
|
module PactBroker
|
|
13
14
|
module Api
|
|
@@ -15,6 +16,7 @@ module PactBroker
|
|
|
15
16
|
class Pact < BaseResource
|
|
16
17
|
include PacticipantResourceMethods
|
|
17
18
|
include WebhookExecutionMethods
|
|
19
|
+
include PactResourceMethods
|
|
18
20
|
|
|
19
21
|
def content_types_provided
|
|
20
22
|
[
|
|
@@ -110,19 +112,6 @@ module PactBroker
|
|
|
110
112
|
@pact_params ||= PactBroker::Pacts::PactParams.from_request request, path_info
|
|
111
113
|
end
|
|
112
114
|
|
|
113
|
-
def set_post_deletion_response
|
|
114
|
-
latest_pact = pact_service.find_latest_pact(pact_params)
|
|
115
|
-
response_body = { "_links" => { index: { href: base_url } } }
|
|
116
|
-
if latest_pact
|
|
117
|
-
response_body["_links"]["pb:latest-pact-version"] = {
|
|
118
|
-
href: latest_pact_url(base_url, latest_pact),
|
|
119
|
-
title: "Latest pact"
|
|
120
|
-
}
|
|
121
|
-
end
|
|
122
|
-
response.body = response_body.to_json
|
|
123
|
-
response.headers["Content-Type" => "application/hal+json;charset=utf-8"]
|
|
124
|
-
end
|
|
125
|
-
|
|
126
115
|
def webhook_options
|
|
127
116
|
{
|
|
128
117
|
database_connector: database_connector,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module PactBroker
|
|
2
|
+
module Api
|
|
3
|
+
module Resources
|
|
4
|
+
module PactResourceMethods
|
|
5
|
+
def set_post_deletion_response
|
|
6
|
+
latest_pact = pact_service.find_latest_pact(
|
|
7
|
+
consumer_name: pact_params[:consumer_name],
|
|
8
|
+
provider_name: pact_params[:provider_name]
|
|
9
|
+
)
|
|
10
|
+
response_body = { "_links" => { index: { href: base_url } } }
|
|
11
|
+
if latest_pact
|
|
12
|
+
response_body["_links"]["pb:latest-pact-version"] = {
|
|
13
|
+
href: latest_pact_url(base_url, latest_pact),
|
|
14
|
+
title: "Latest pact"
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
response.body = response_body.to_json
|
|
18
|
+
response.headers["Content-Type" => "application/hal+json;charset=utf-8"]
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
require 'pact_broker/api/resources/pact'
|
|
2
|
+
require 'pact_broker/api/resources/metadata_resource_methods'
|
|
2
3
|
|
|
3
4
|
module PactBroker
|
|
4
5
|
module Api
|
|
5
6
|
module Resources
|
|
6
7
|
class PactVersion < Pact
|
|
8
|
+
include MetadataResourceMethods
|
|
9
|
+
|
|
7
10
|
def allowed_methods
|
|
8
11
|
["GET", "OPTIONS"]
|
|
9
12
|
end
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
require 'pact_broker/api/resources/base_resource'
|
|
2
2
|
require 'pact_broker/configuration'
|
|
3
3
|
require 'pact_broker/api/decorators/tagged_pact_versions_decorator'
|
|
4
|
+
require 'pact_broker/api/resources/pact_resource_methods'
|
|
4
5
|
|
|
5
6
|
module PactBroker
|
|
6
7
|
module Api
|
|
7
8
|
module Resources
|
|
8
9
|
class TaggedPactVersions < BaseResource
|
|
10
|
+
include PactResourceMethods
|
|
11
|
+
|
|
9
12
|
def content_types_provided
|
|
10
13
|
[["application/hal+json", :to_json]]
|
|
11
14
|
end
|
|
@@ -24,6 +27,7 @@ module PactBroker
|
|
|
24
27
|
|
|
25
28
|
def delete_resource
|
|
26
29
|
pact_service.delete_all_pact_publications_between consumer_name, and: provider_name, tag: identifier_from_path[:tag]
|
|
30
|
+
set_post_deletion_response
|
|
27
31
|
true
|
|
28
32
|
end
|
|
29
33
|
|
|
@@ -4,12 +4,14 @@ require 'pact_broker/domain/verification'
|
|
|
4
4
|
require 'pact_broker/api/contracts/verification_contract'
|
|
5
5
|
require 'pact_broker/api/decorators/verification_decorator'
|
|
6
6
|
require 'pact_broker/api/resources/webhook_execution_methods'
|
|
7
|
+
require 'pact_broker/api/resources/metadata_resource_methods'
|
|
7
8
|
|
|
8
9
|
module PactBroker
|
|
9
10
|
module Api
|
|
10
11
|
module Resources
|
|
11
12
|
class Verifications < BaseResource
|
|
12
13
|
include WebhookExecutionMethods
|
|
14
|
+
include MetadataResourceMethods
|
|
13
15
|
|
|
14
16
|
def content_types_accepted
|
|
15
17
|
[["application/json", :from_json]]
|
|
@@ -75,10 +77,6 @@ module PactBroker
|
|
|
75
77
|
PactBroker::Api::Decorators::VerificationDecorator.new(model)
|
|
76
78
|
end
|
|
77
79
|
|
|
78
|
-
def metadata
|
|
79
|
-
PactBrokerUrls.decode_pact_metadata(identifier_from_path[:metadata])
|
|
80
|
-
end
|
|
81
|
-
|
|
82
80
|
def wip?
|
|
83
81
|
metadata[:wip] == 'true'
|
|
84
82
|
end
|
data/lib/pact_broker/app.rb
CHANGED
|
@@ -126,6 +126,7 @@ module PactBroker
|
|
|
126
126
|
PactBroker::DB.validate_connection_config if configuration.validate_database_connection_config
|
|
127
127
|
PactBroker::DB.set_mysql_strict_mode_if_mysql
|
|
128
128
|
PactBroker::DB.connection.extension(:pagination)
|
|
129
|
+
PactBroker::DB.connection.extension(:statement_timeout)
|
|
129
130
|
|
|
130
131
|
Sequel.datetime_class = DateTime
|
|
131
132
|
Sequel.database_timezone = :utc # Store all dates in UTC, assume any date without a TZ is UTC
|
|
@@ -38,7 +38,8 @@ module PactBroker
|
|
|
38
38
|
:log_dir,
|
|
39
39
|
:allow_missing_migration_files,
|
|
40
40
|
:auto_migrate_db_data,
|
|
41
|
-
:use_rack_protection
|
|
41
|
+
:use_rack_protection,
|
|
42
|
+
:metrics_sql_statement_timeout
|
|
42
43
|
]
|
|
43
44
|
|
|
44
45
|
attr_accessor :base_url, :log_dir, :database_connection, :auto_migrate_db, :auto_migrate_db_data, :allow_missing_migration_files, :example_data_seeder, :seed_example_data, :use_hal_browser, :html_pact_renderer, :use_rack_protection
|
|
@@ -57,6 +58,7 @@ module PactBroker
|
|
|
57
58
|
attr_reader :api_error_reporters
|
|
58
59
|
attr_reader :custom_logger
|
|
59
60
|
attr_accessor :policy_builder, :policy_scope_builder, :base_resource_class_factory
|
|
61
|
+
attr_accessor :metrics_sql_statement_timeout
|
|
60
62
|
|
|
61
63
|
alias_method :policy_finder=, :policy_builder=
|
|
62
64
|
alias_method :policy_scope_finder=, :policy_scope_builder=
|
|
@@ -125,7 +127,8 @@ module PactBroker
|
|
|
125
127
|
require 'pact_broker/api/resources/default_base_resource'
|
|
126
128
|
PactBroker::Api::Resources::DefaultBaseResource
|
|
127
129
|
}
|
|
128
|
-
config.warning_error_class_names = ['Sequel::ForeignKeyConstraintViolation']
|
|
130
|
+
config.warning_error_class_names = ['Sequel::ForeignKeyConstraintViolation', 'PG::QueryCanceled']
|
|
131
|
+
config.metrics_sql_statement_timeout = 30
|
|
129
132
|
config
|
|
130
133
|
end
|
|
131
134
|
|
|
@@ -247,8 +250,13 @@ module PactBroker
|
|
|
247
250
|
|
|
248
251
|
def warning_error_classes
|
|
249
252
|
warning_error_class_names.collect do | class_name |
|
|
250
|
-
|
|
251
|
-
|
|
253
|
+
begin
|
|
254
|
+
Object.const_get(class_name)
|
|
255
|
+
rescue NameError => e
|
|
256
|
+
logger.warn("Class #{class_name} couldn't be loaded as a warning error class (#{e.class} - #{e.message}). Ignoring.")
|
|
257
|
+
nil
|
|
258
|
+
end
|
|
259
|
+
end.compact
|
|
252
260
|
end
|
|
253
261
|
|
|
254
262
|
private
|