pact_broker 2.96.0 → 2.99.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/CHANGELOG.md +43 -0
- data/Gemfile +1 -0
- data/docs/CONFIGURATION.md +131 -67
- data/lib/db.rb +1 -7
- data/lib/pact_broker/api/middleware/http_debug_logs.rb +42 -0
- data/lib/pact_broker/api/resources/base_resource.rb +4 -0
- data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
- data/lib/pact_broker/api/resources/pact.rb +0 -8
- data/lib/pact_broker/api/resources/pact_content_diff.rb +7 -2
- data/lib/pact_broker/api/resources/pact_versions.rb +1 -5
- data/lib/pact_broker/api/resources/pact_versions_for_branch.rb +1 -5
- data/lib/pact_broker/api/resources/provider_pacts.rb +1 -1
- data/lib/pact_broker/api/resources/tagged_pact_versions.rb +1 -5
- data/lib/pact_broker/api/resources/verification.rb +0 -4
- data/lib/pact_broker/api/resources/verifications.rb +0 -4
- data/lib/pact_broker/api/resources/version.rb +8 -0
- data/lib/pact_broker/app.rb +3 -7
- data/lib/pact_broker/config/runtime_configuration.rb +24 -5
- data/lib/pact_broker/config/runtime_configuration_coercion_methods.rb +11 -0
- data/lib/pact_broker/config/runtime_configuration_database_methods.rb +2 -2
- data/lib/pact_broker/config/runtime_configuration_logging_methods.rb +7 -2
- data/lib/pact_broker/configuration.rb +2 -0
- data/lib/pact_broker/db/models.rb +2 -2
- data/lib/pact_broker/index/service.rb +1 -2
- data/lib/pact_broker/integrations/integration.rb +21 -6
- data/lib/pact_broker/integrations/service.rb +1 -1
- data/lib/pact_broker/matrix/every_row.rb +19 -1
- data/lib/pact_broker/matrix/integration.rb +5 -5
- data/lib/pact_broker/matrix/quick_row.rb +36 -3
- data/lib/pact_broker/matrix/repository.rb +4 -3
- data/lib/pact_broker/matrix/service.rb +0 -1
- data/lib/pact_broker/metrics/service.rb +2 -2
- data/lib/pact_broker/pacts/create_formatted_diff.rb +1 -0
- data/lib/pact_broker/pacts/eager_loaders.rb +4 -1
- data/lib/pact_broker/pacts/pact_publication.rb +9 -6
- data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +25 -0
- data/lib/pact_broker/pacts/pact_publication_wip_dataset_module.rb +0 -15
- data/lib/pact_broker/pacts/pact_version.rb +24 -28
- data/lib/pact_broker/pacts/pact_version_association_loaders.rb +36 -0
- data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +9 -13
- data/lib/pact_broker/pacts/repository.rb +29 -27
- data/lib/pact_broker/test/http_test_data_builder.rb +11 -2
- data/lib/pact_broker/test/test_data_builder.rb +2 -1
- data/lib/pact_broker/ui/controllers/matrix.rb +14 -11
- data/lib/pact_broker/ui/views/groups/show.html.erb +2 -2
- data/lib/pact_broker/version.rb +1 -1
- data/pact_broker.gemspec +1 -1
- metadata +9 -16
- data/lib/pact_broker/matrix/aggregated_row.rb +0 -79
- data/lib/pact_broker/matrix/head_row.rb +0 -80
- data/lib/pact_broker/matrix/row.rb +0 -287
@@ -1,6 +1,7 @@
|
|
1
1
|
require "pact_broker/api/resources/base_resource"
|
2
2
|
require "pact_broker/pacts/pact_params"
|
3
3
|
require "pact_broker/pacts/diff"
|
4
|
+
require "timeout"
|
4
5
|
|
5
6
|
module PactBroker
|
6
7
|
module Api
|
@@ -19,8 +20,12 @@ module PactBroker
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def to_text
|
22
|
-
|
23
|
-
|
23
|
+
Timeout::timeout(PactBroker.configuration.pact_content_diff_timeout) do
|
24
|
+
output = PactBroker::Pacts::Diff.new.process pact_params.merge(base_url: base_url), comparison_pact_params, raw: false
|
25
|
+
response.body = output
|
26
|
+
end
|
27
|
+
rescue Timeout::Error
|
28
|
+
408
|
24
29
|
end
|
25
30
|
|
26
31
|
def pact
|
data/lib/pact_broker/app.rb
CHANGED
@@ -29,6 +29,7 @@ require "pact_broker/api/middleware/configuration"
|
|
29
29
|
require "pact_broker/api/middleware/basic_auth"
|
30
30
|
require "pact_broker/config/basic_auth_configuration"
|
31
31
|
require "pact_broker/api/authorization/resource_access_policy"
|
32
|
+
require "pact_broker/api/middleware/http_debug_logs"
|
32
33
|
|
33
34
|
module PactBroker
|
34
35
|
|
@@ -134,17 +135,11 @@ module PactBroker
|
|
134
135
|
# Keep this configuration in sync with lib/db.rb
|
135
136
|
configuration.database_connection ||= PactBroker.create_database_connection(configuration.database_configuration, configuration.logger)
|
136
137
|
PactBroker::DB.connection = configuration.database_connection
|
137
|
-
PactBroker::DB.connection.extend_datasets do
|
138
|
-
# rubocop: disable Lint/NestedMethodDefinition
|
139
|
-
def any?
|
140
|
-
!empty?
|
141
|
-
end
|
142
|
-
# rubocop: enable Lint/NestedMethodDefinition
|
143
|
-
end
|
144
138
|
PactBroker::DB.validate_connection_config if configuration.validate_database_connection_config
|
145
139
|
PactBroker::DB.set_mysql_strict_mode_if_mysql
|
146
140
|
PactBroker::DB.connection.extension(:pagination)
|
147
141
|
PactBroker::DB.connection.extension(:statement_timeout)
|
142
|
+
PactBroker::DB.connection.extension(:any_not_empty)
|
148
143
|
PactBroker::DB.connection.timezone = :utc
|
149
144
|
Sequel.datetime_class = DateTime
|
150
145
|
Sequel.database_timezone = :utc # Store all dates in UTC, assume any date without a TZ is UTC
|
@@ -180,6 +175,7 @@ module PactBroker
|
|
180
175
|
end
|
181
176
|
|
182
177
|
def configure_middleware
|
178
|
+
@app_builder.use PactBroker::Api::Middleware::HttpDebugLogs if configuration.http_debug_logging_enabled
|
183
179
|
configure_basic_auth
|
184
180
|
configure_rack_protection
|
185
181
|
@app_builder.use Rack::PactBroker::InvalidUriProtection
|
@@ -39,7 +39,8 @@ module PactBroker
|
|
39
39
|
log_format: nil,
|
40
40
|
warning_error_class_names: ["Sequel::ForeignKeyConstraintViolation"],
|
41
41
|
hide_pactflow_messages: false,
|
42
|
-
log_configuration_on_startup: true
|
42
|
+
log_configuration_on_startup: true,
|
43
|
+
http_debug_logging_enabled: false
|
43
44
|
)
|
44
45
|
|
45
46
|
on_load :validate_logging_attributes!
|
@@ -52,9 +53,12 @@ module PactBroker
|
|
52
53
|
webhook_scheme_whitelist: ["https"],
|
53
54
|
webhook_host_whitelist: [],
|
54
55
|
disable_ssl_verification: false,
|
55
|
-
|
56
|
-
user_agent: "Pact Broker v#{PactBroker::VERSION}",
|
56
|
+
user_agent: "Pact Broker v#{PactBroker::VERSION}"
|
57
57
|
)
|
58
|
+
# no default, if you set it to [] or nil, then anyway config blows up when it tries to merge in the
|
59
|
+
# numerically indexed hash from the environment variables.
|
60
|
+
attr_config :webhook_certificates
|
61
|
+
on_load :set_webhook_attribute_defaults
|
58
62
|
|
59
63
|
# resource attributes
|
60
64
|
attr_config(
|
@@ -67,7 +71,8 @@ module PactBroker
|
|
67
71
|
badge_provider_mode: :redirect,
|
68
72
|
enable_public_badge_access: false,
|
69
73
|
shields_io_base_url: "https://img.shields.io",
|
70
|
-
use_case_sensitive_resource_names: true
|
74
|
+
use_case_sensitive_resource_names: true,
|
75
|
+
pact_content_diff_timeout: 15
|
71
76
|
)
|
72
77
|
|
73
78
|
# domain attributes
|
@@ -178,8 +183,14 @@ module PactBroker
|
|
178
183
|
def webhook_certificates= webhook_certificates
|
179
184
|
if webhook_certificates.is_a?(Array)
|
180
185
|
super(webhook_certificates.collect(&:symbolize_keys))
|
186
|
+
elsif webhook_certificates.is_a?(Hash)
|
187
|
+
if all_keys_are_number_strings?(webhook_certificates)
|
188
|
+
super(convert_hash_with_number_string_keys_to_array(webhook_certificates).collect(&:symbolize_keys))
|
189
|
+
else
|
190
|
+
raise_validation_error("webhook_certificates must be an array, or a hash where each key is an integer in string format.")
|
191
|
+
end
|
181
192
|
elsif !webhook_certificates.nil?
|
182
|
-
raise_validation_error("webhook_certificates
|
193
|
+
raise_validation_error("webhook_certificates cannot be set using a #{webhook_certificates.class}")
|
183
194
|
end
|
184
195
|
end
|
185
196
|
|
@@ -208,6 +219,14 @@ module PactBroker
|
|
208
219
|
def raise_validation_error(msg)
|
209
220
|
raise PactBroker::ConfigurationError, msg
|
210
221
|
end
|
222
|
+
|
223
|
+
def set_webhook_attribute_defaults
|
224
|
+
# can't set a default on this, or anyway config blows up when trying to merge the
|
225
|
+
# hash from the env vars into an array/nil.
|
226
|
+
if webhook_certificates.nil?
|
227
|
+
self.webhook_certificates = []
|
228
|
+
end
|
229
|
+
end
|
211
230
|
end
|
212
231
|
end
|
213
232
|
end
|
@@ -4,6 +4,17 @@ require "pact_broker/config/space_delimited_integer_list"
|
|
4
4
|
module PactBroker
|
5
5
|
module Config
|
6
6
|
module RuntimeConfigurationCoercionMethods
|
7
|
+
|
8
|
+
def all_keys_are_number_strings?(hash)
|
9
|
+
hash.keys.all? { | k | k.to_s.to_i.to_s == k } # is an integer as a string
|
10
|
+
end
|
11
|
+
|
12
|
+
def convert_hash_with_number_string_keys_to_array(hash)
|
13
|
+
hash.keys.collect{ |k| [k, k.to_i]}.sort_by(&:last).collect(&:first).collect do | key |
|
14
|
+
hash[key]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
7
18
|
def value_to_string_array value, property_name
|
8
19
|
if value.is_a?(String)
|
9
20
|
PactBroker::Config::SpaceDelimitedStringList.parse(value)
|
@@ -16,7 +16,7 @@ module PactBroker
|
|
16
16
|
database_port: nil,
|
17
17
|
database_url: nil,
|
18
18
|
database_sslmode: nil,
|
19
|
-
sql_log_level: :
|
19
|
+
sql_log_level: :none,
|
20
20
|
sql_log_warn_duration: 5,
|
21
21
|
sql_enable_caller_logging: false,
|
22
22
|
database_max_connections: nil,
|
@@ -82,7 +82,7 @@ module PactBroker
|
|
82
82
|
private :postgres?
|
83
83
|
|
84
84
|
def driver_options
|
85
|
-
if postgres?
|
85
|
+
if postgres? && database_statement_timeout
|
86
86
|
{ options: "-c statement_timeout=#{database_statement_timeout}s" }
|
87
87
|
end
|
88
88
|
end
|
@@ -24,12 +24,17 @@ module PactBroker
|
|
24
24
|
module InstanceMethods
|
25
25
|
# base_url raises a not implemented error
|
26
26
|
def log_configuration(logger)
|
27
|
-
|
28
|
-
|
27
|
+
source_info = to_source_trace
|
28
|
+
(self.class.config_attributes - [:base_url]).collect(&:to_s).each_with_object({})do | key, new_hash |
|
29
|
+
new_hash[key] = {
|
30
|
+
value: self.send(key.to_sym),
|
31
|
+
source: source_info.dig(key, :source) || {:type=>:defaults}
|
32
|
+
}
|
29
33
|
end.sort_by { |key, _| key }.each { |key, value| log_config_inner(key, value, logger) }
|
30
34
|
end
|
31
35
|
|
32
36
|
def log_config_inner(key, value, logger)
|
37
|
+
# TODO fix the source display for webhook_certificates set by environment variables
|
33
38
|
if !value.has_key? :value
|
34
39
|
value.sort_by { |inner_key, _| inner_key }.each { |inner_key, inner_value| log_config_inner("#{key}.#{inner_key}", inner_value, logger) }
|
35
40
|
elsif self.class.sensitive_value?(key)
|
@@ -55,6 +55,8 @@ module PactBroker
|
|
55
55
|
config.version_parser = PactBroker::Versions::ParseSemanticVersion
|
56
56
|
config.sha_generator = PactBroker::Pacts::GenerateSha
|
57
57
|
config.example_data_seeder = lambda do
|
58
|
+
# Do the require in the lambda, not at the top of the file, because we need
|
59
|
+
# the database connection to be made before loading any Sequel::Model classes.
|
58
60
|
require "pact_broker/db/seed_example_data"
|
59
61
|
PactBroker::DB::SeedExampleData.call
|
60
62
|
end
|
@@ -14,11 +14,11 @@ require "pact_broker/domain/pacticipant"
|
|
14
14
|
require "pact_broker/deployments/environment"
|
15
15
|
require "pact_broker/deployments/deployed_version"
|
16
16
|
require "pact_broker/deployments/released_version"
|
17
|
-
require "pact_broker/matrix/row"
|
18
|
-
require "pact_broker/matrix/head_row"
|
19
17
|
require "pact_broker/versions/branch"
|
20
18
|
require "pact_broker/versions/branch_version"
|
21
19
|
require "pact_broker/versions/branch_head"
|
20
|
+
require "pact_broker/matrix/quick_row"
|
21
|
+
require "pact_broker/matrix/every_row"
|
22
22
|
|
23
23
|
module PactBroker
|
24
24
|
INTEGRATIONS_TABLES = [
|
@@ -1,10 +1,9 @@
|
|
1
1
|
require "pact_broker/repositories"
|
2
2
|
require "pact_broker/logging"
|
3
3
|
require "pact_broker/domain/index_item"
|
4
|
-
require "pact_broker/matrix/head_row"
|
5
|
-
require "pact_broker/matrix/aggregated_row"
|
6
4
|
require "pact_broker/repositories/helpers"
|
7
5
|
require "pact_broker/index/page"
|
6
|
+
require "pact_broker/verifications/latest_verification_for_consumer_version_tag"
|
8
7
|
|
9
8
|
module PactBroker
|
10
9
|
module Index
|
@@ -3,6 +3,7 @@ require "pact_broker/verifications/pseudo_branch_status"
|
|
3
3
|
require "pact_broker/domain/verification"
|
4
4
|
require "pact_broker/webhooks/latest_triggered_webhook"
|
5
5
|
require "pact_broker/webhooks/webhook"
|
6
|
+
require "pact_broker/verifications/latest_verification_for_consumer_and_provider"
|
6
7
|
|
7
8
|
module PactBroker
|
8
9
|
module Integrations
|
@@ -21,17 +22,30 @@ module PactBroker
|
|
21
22
|
integration.associations[:latest_pact] = nil
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
|
26
|
+
# Would prefer to be able to eager load only the fields specified in the original Integrations
|
27
|
+
# query, but we don't seem to have that information in this context.
|
28
|
+
# Need the latest verification for the verification status in the index response.
|
29
|
+
latest_pact_publications_query = PactBroker::Pacts::PactPublication
|
30
|
+
.eager_for_domain_with_content
|
31
|
+
.eager(pact_version: :latest_verification)
|
32
|
+
.overall_latest
|
33
|
+
|
34
|
+
latest_pact_publications_query.all.each do | pact |
|
35
|
+
eo_opts[:id_map][[pact.consumer_id, pact.provider_id]]&.each do | integration |
|
36
|
+
integration.associations[:latest_pact] = pact
|
29
37
|
end
|
30
38
|
end
|
31
39
|
end
|
32
40
|
|
33
41
|
one_to_one(:latest_pact, class: "PactBroker::Pacts::PactPublication", :key => [:consumer_id, :provider_id], primary_key: [:consumer_id, :provider_id], :eager_loader=> LATEST_PACT_EAGER_LOADER) do | _ds |
|
34
|
-
|
42
|
+
# Would prefer to be able to eager load only the fields specified in the original Integrations
|
43
|
+
# query, but we don't seem to have that information in this context.
|
44
|
+
# Need the latest verification for the verification status in the index response.
|
45
|
+
PactBroker::Pacts::PactPublication
|
46
|
+
.eager_for_domain_with_content
|
47
|
+
.eager(pact_version: :latest_verification)
|
48
|
+
.overall_latest_for_consumer_id_and_provider_id(consumer_id, provider_id)
|
35
49
|
end
|
36
50
|
|
37
51
|
# When viewing the index, every webhook in the database will match at least one of the rows, so
|
@@ -65,6 +79,7 @@ module PactBroker
|
|
65
79
|
end
|
66
80
|
end
|
67
81
|
|
82
|
+
# TODO make this the verification status for the latest from main branch
|
68
83
|
def verification_status_for_latest_pact
|
69
84
|
@verification_status_for_latest_pact ||= PactBroker::Verifications::PseudoBranchStatus.new(latest_pact, latest_pact&.latest_verification)
|
70
85
|
end
|
@@ -26,7 +26,7 @@ module PactBroker
|
|
26
26
|
scope_for(PactBroker::Integrations::Integration)
|
27
27
|
.eager(:consumer)
|
28
28
|
.eager(:provider)
|
29
|
-
.eager(latest_pact
|
29
|
+
.eager(:latest_pact) # latest_pact eager loader is custom, can't take any more options
|
30
30
|
.eager(:latest_verification)
|
31
31
|
.all
|
32
32
|
.sort { | a, b| Integration.compare_by_last_action_date(a, b) }
|
@@ -17,15 +17,19 @@ module PactBroker
|
|
17
17
|
Sequel[:p][:created_at].as(:consumer_version_created_at),
|
18
18
|
Sequel[:p][:id].as(:pact_order)
|
19
19
|
]
|
20
|
+
|
20
21
|
VERIFICATION_COLUMNS = [
|
21
22
|
Sequel[:v][:id].as(:verification_id),
|
22
23
|
Sequel[:v][:provider_version_id],
|
23
24
|
Sequel[:v][:created_at].as(:provider_version_created_at)
|
24
25
|
]
|
25
26
|
|
27
|
+
JOINED_VERIFICATION_COLUMNS = [:id, :pact_version_id, :provider_id, :provider_version_id, :created_at]
|
28
|
+
|
26
29
|
ALL_COLUMNS = PACT_COLUMNS + VERIFICATION_COLUMNS
|
27
30
|
|
28
31
|
SELECT_ALL_COLUMN_ARGS = [:select_all_columns] + ALL_COLUMNS
|
32
|
+
|
29
33
|
dataset_module do
|
30
34
|
select(*SELECT_ALL_COLUMN_ARGS)
|
31
35
|
|
@@ -33,9 +37,23 @@ module PactBroker
|
|
33
37
|
left_outer_join(:verifications, P_V_JOIN, { table_alias: :v } )
|
34
38
|
end
|
35
39
|
|
40
|
+
def inner_join_verifications
|
41
|
+
join(:verifications, P_V_JOIN, { table_alias: :v } )
|
42
|
+
end
|
43
|
+
|
44
|
+
def inner_join_verifications_matching_one_selector_provider_or_provider_version(query_ids)
|
45
|
+
verifications = db[:verifications]
|
46
|
+
.select(*JOINED_VERIFICATION_COLUMNS)
|
47
|
+
.where {
|
48
|
+
QueryBuilder.provider_or_provider_version_matches(query_ids)
|
49
|
+
}
|
50
|
+
|
51
|
+
join(verifications, P_V_JOIN, { table_alias: :v } )
|
52
|
+
end
|
53
|
+
|
36
54
|
def verifications_for(query_ids)
|
37
55
|
db[:verifications]
|
38
|
-
.select(
|
56
|
+
.select(*JOINED_VERIFICATION_COLUMNS)
|
39
57
|
.where {
|
40
58
|
Sequel.&(
|
41
59
|
QueryBuilder.consumer_in_pacticipant_ids(query_ids),
|
@@ -1,9 +1,9 @@
|
|
1
|
-
|
2
1
|
# Represents the integration relationship between a consumer and a provider in the context
|
3
2
|
# of a matrix or can-i-deploy query.
|
4
|
-
# If the required flag is set, then one of the pacticipants
|
5
|
-
# requires the provider.
|
6
|
-
# integration with a consumer.
|
3
|
+
# If the required flag is set, then one of the pacticipants specified in the matrix query
|
4
|
+
# is a consumer and it requires the provider to be already deployed. An integration would not be required if a provider
|
5
|
+
# was specified, and it had an integration with a consumer, but that consumer wasn't deployed yet.
|
6
|
+
#
|
7
7
|
|
8
8
|
module PactBroker
|
9
9
|
module Matrix
|
@@ -11,7 +11,7 @@ module PactBroker
|
|
11
11
|
|
12
12
|
attr_reader :consumer_name, :consumer_id, :provider_name, :provider_id
|
13
13
|
|
14
|
-
def initialize
|
14
|
+
def initialize(consumer_id, consumer_name, provider_id, provider_name, required)
|
15
15
|
@consumer_id = consumer_id
|
16
16
|
@consumer_name = consumer_name
|
17
17
|
@provider_id = provider_id
|
@@ -11,6 +11,14 @@ require "pact_broker/pacts/pact_publication"
|
|
11
11
|
require "pact_broker/tags/tag_with_latest_flag"
|
12
12
|
require "pact_broker/matrix/query_ids"
|
13
13
|
|
14
|
+
# The PactBroker::Matrix::QuickRow represents a row in the table that is created when
|
15
|
+
# the consumer versions are joined to the provider versions via the pacts and verifications tables,
|
16
|
+
# aka "The Matrix". The difference between this class and the EveryRow class is that
|
17
|
+
# the EveryRow class includes results for overridden pact verisons and verifications (used only when there is no latestby
|
18
|
+
# set in the matrix query), where as the QuickRow class does not.
|
19
|
+
# It is called the QuickRow because the initial implementation was called the Row, and this is an optimised
|
20
|
+
# version. It needs to be renamed back to Row now that the old Row class has been deleted.
|
21
|
+
|
14
22
|
# The difference between `join_verifications_for` and `join_verifications` is that
|
15
23
|
# the left outer join is done on a pre-filtered dataset in `join_verifications_for`,
|
16
24
|
# so that we get a row with null verification fields for a pact that has been verified
|
@@ -19,6 +27,7 @@ require "pact_broker/matrix/query_ids"
|
|
19
27
|
|
20
28
|
module PactBroker
|
21
29
|
module Matrix
|
30
|
+
# TODO rename this to just Row
|
22
31
|
# rubocop: disable Metrics/ClassLength
|
23
32
|
class QuickRow < Sequel::Model(Sequel.as(:latest_pact_publication_ids_for_consumer_versions, :p))
|
24
33
|
|
@@ -45,6 +54,15 @@ module PactBroker
|
|
45
54
|
Sequel[:v][:verification_id],
|
46
55
|
Sequel[:v][:created_at].as(:provider_version_created_at)
|
47
56
|
]
|
57
|
+
|
58
|
+
JOINED_VERIFICATION_COLUMNS = [
|
59
|
+
:verification_id,
|
60
|
+
:provider_version_id,
|
61
|
+
:pact_version_id,
|
62
|
+
:provider_id,
|
63
|
+
:created_at
|
64
|
+
]
|
65
|
+
|
48
66
|
LAST_ACTION_DATE = Sequel.lit("CASE WHEN (provider_version_created_at IS NOT NULL AND provider_version_created_at > consumer_version_created_at) THEN provider_version_created_at ELSE consumer_version_created_at END").as(:last_action_date)
|
49
67
|
|
50
68
|
ALL_COLUMNS = PACT_COLUMNS + VERIFICATION_COLUMNS
|
@@ -146,10 +164,15 @@ module PactBroker
|
|
146
164
|
# When we have one selector, we need to join ALL the verifications to find out
|
147
165
|
# what integrations exist
|
148
166
|
def matching_one_selector(selectors)
|
149
|
-
|
167
|
+
query_ids = QueryIds.from_selectors(selectors)
|
168
|
+
rows_where_selector_matches_consumer_cols = join_verifications
|
150
169
|
.where {
|
151
|
-
QueryBuilder.
|
170
|
+
QueryBuilder.consumer_or_consumer_version_matches(query_ids, :p)
|
152
171
|
}
|
172
|
+
|
173
|
+
rows_where_selector_matches_provider_cols = inner_join_verifications_matching_one_selector_provider_or_provider_version(query_ids)
|
174
|
+
|
175
|
+
rows_where_selector_matches_consumer_cols.union(rows_where_selector_matches_provider_cols)
|
153
176
|
end
|
154
177
|
|
155
178
|
def pacticipant_ids_matching_one_selector_optimised(selectors)
|
@@ -229,9 +252,19 @@ module PactBroker
|
|
229
252
|
left_outer_join(verifications_for(query_ids), LP_LV_JOIN, { table_alias: :v } )
|
230
253
|
end
|
231
254
|
|
255
|
+
def inner_join_verifications_matching_one_selector_provider_or_provider_version(query_ids)
|
256
|
+
verifications = db[LV]
|
257
|
+
.select(*JOINED_VERIFICATION_COLUMNS)
|
258
|
+
.where {
|
259
|
+
QueryBuilder.provider_or_provider_version_matches(query_ids)
|
260
|
+
}
|
261
|
+
|
262
|
+
join(verifications, LP_LV_JOIN, { table_alias: :v } )
|
263
|
+
end
|
264
|
+
|
232
265
|
def verifications_for(query_ids)
|
233
266
|
db[LV]
|
234
|
-
.select(
|
267
|
+
.select(*JOINED_VERIFICATION_COLUMNS)
|
235
268
|
.where {
|
236
269
|
Sequel.&(
|
237
270
|
QueryBuilder.consumer_in_pacticipant_ids(query_ids),
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require "pact_broker/logging"
|
2
2
|
require "pact_broker/repositories/helpers"
|
3
|
-
require "pact_broker/matrix/row"
|
4
3
|
require "pact_broker/matrix/quick_row"
|
5
4
|
require "pact_broker/matrix/every_row"
|
6
|
-
require "pact_broker/matrix/head_row"
|
7
5
|
require "pact_broker/error"
|
8
6
|
require "pact_broker/matrix/query_results"
|
9
7
|
require "pact_broker/matrix/integration"
|
@@ -24,7 +22,8 @@ module PactBroker
|
|
24
22
|
|
25
23
|
# TODO move latest verification logic in to database
|
26
24
|
|
27
|
-
|
25
|
+
# Used when using table_print to output query results
|
26
|
+
TP_COLS = [ :consumer_version_number, :pact_revision_number, :provider_version_number, :verification_number]
|
28
27
|
|
29
28
|
GROUP_BY_PROVIDER_VERSION_NUMBER = [:consumer_name, :consumer_version_number, :provider_name, :provider_version_number]
|
30
29
|
GROUP_BY_PROVIDER = [:consumer_name, :consumer_version_number, :provider_name]
|
@@ -124,6 +123,8 @@ module PactBroker
|
|
124
123
|
end
|
125
124
|
end
|
126
125
|
|
126
|
+
# Why does the consumer equivalent of this method use the QuickRow distinct_integrations_for_selector_as_consumer
|
127
|
+
# while this method uses the Integration?
|
127
128
|
def integrations_where_specified_selector_is_provider(resolved_specified_selectors)
|
128
129
|
integrations_involving_specified_providers = PactBroker::Integrations::Integration
|
129
130
|
.where(provider_id: resolved_specified_selectors.collect(&:pacticipant_id))
|
@@ -118,8 +118,8 @@ module PactBroker
|
|
118
118
|
|
119
119
|
def matrix_count
|
120
120
|
begin
|
121
|
-
PactBroker::Matrix::
|
122
|
-
PactBroker::Matrix::
|
121
|
+
PactBroker::Matrix::EveryRow.db.with_statement_timeout(PactBroker.configuration.metrics_sql_statement_timeout) do
|
122
|
+
PactBroker::Matrix::EveryRow.default_scope.count
|
123
123
|
end
|
124
124
|
rescue Sequel::DatabaseError => _ex
|
125
125
|
-1
|
@@ -32,7 +32,10 @@ module PactBroker
|
|
32
32
|
|
33
33
|
pact_publications.each do | pact_publication |
|
34
34
|
pact_publication.consumer_version_tags.collect(&:name).sort.each do | tag_name |
|
35
|
-
|
35
|
+
# Not sure how this can ever be nil, but a PF error suggests that it has happend. Maybe a timing issue?
|
36
|
+
if head_pact_publications_by_tag[tag_name]
|
37
|
+
pact_publication.associations[:head_pact_publications_for_tags] << head_pact_publications_by_tag[tag_name]
|
38
|
+
end
|
36
39
|
end
|
37
40
|
end
|
38
41
|
end
|